前言
在Ubuntu上搭建Hbase集群后,用hbase shell命令可以正常访问集群;但是,在本地用java客户端连接Hbase集群时,连接不上hbase数据库,java客户端非常简单,所以可以排除是代码的问题。基本的java客户端连接实例如下:
package com.funshion.artemis.storm.topology;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.KeyValue;
import org.apache.hadoop.hbase.client.HTableInterface;
import org.apache.hadoop.hbase.client.HTablePool;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.ResultScanner;
import org.apache.hadoop.hbase.client.Scan;public class HBaseTest {
public static Configuration conf;
static {
conf = HBaseConfiguration.create();
conf.set("hbase.zookeeper.property.clientPort", "2181");
conf.set("hbase.zookeeper.quorum", "artemis-02,artemis-03,artemis-04");
}public static void main(String args[]) throws Exception {
queryByCondition("test");
}public static void queryByCondition(String tableName) throws IOException {
HTablePool pool = new HTablePool(conf, 5);
HTableInterface table = pool.getTable(tableName);
Scan s = new Scan();
ResultScanner rs = table.getScanner(s);for (Result r : rs) {
for (KeyValue kv : r.raw()) {
String rowKey = kv.getKeyString();
String column = kv.getFamily().toString();
String value = kv.getValue().toString();
System.out.println("key:" + rowKey + " column:" + column
+ " value:" + value);
}
}
}
}
1 问题根源
Hbase自身的java api需要反向解析IP的原因,我们可以通过命令nslookup来查看是否反向或者正向解析成功
反向解析验证:nslookup [ip]
【发现 ** server can't find *.*.*.*.in-addr.arpa: NXDOMAIN】
由上述命令可以得知 DNS反向解析没有成功。
2 解决方案
需要搭建一个DNS,此处用bind9来搭建,具体步骤如下:
2.1 安装DNS
sudo apt-get install bind9
安装完之后,我们可以查看都有哪些文件:
hadoop@artemis-02:/etc/bind$ ls
bind.keys db.0 db.127 db.255 db.11.168.192 db.artemis-02 db.empty db.local db.root named.conf named.conf.default-zones named.conf.local named.conf.options rndc.key zones.rfc1918
其中db.11.168.192 以及db.artemis-02是我新建的映射,在这一步大家可以忽略。
2.2 新建ip地址与域名对应关系【很关键的一步】
sudo vi db.11.168.192
;
; BIND reverse data file for local loopback interface
;
$TTL 604800
@ IN SOA artemis-02. root.artemis-02. (
1 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
@ IN NS artemis-02.
215 IN PTR artemis-02.
sudo vi db.artemis-02
;
; BIND data file for local loopback interface
;
$TTL 604800
@ IN SOA artemis-02. root.artemis-02. (
2 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
@ IN NS artemis-02.
@ IN A 192.168.11.215
@ IN AAAA ::1
sudo vi named.conf.default-zones
zone "artemis-02" {
type master;
file "/etc/bind/db.artemis-02";
};zone "11.168.192.in-addr.arpa" {
type master;
file "/etc/bind/db.11.168.192";
};
- sudo vi /etc/resolv.conf
- nameserver 192.168.11.215
2.3 设置权限
- chmod 664 db.11.168.192
- chmod 664 db.artemis-02
- chmod 664 named.conf.default-zones
2.4 重新启动
2.5 测试
利用命令nslookup测试
3 需要注意的地方
- 第一次创建db.11.168.192文件时,我用的名称是db.192,结果发现不成功,则只好修改为db.11.168.192
- 权限的问题,需要注意
- 修改resolv.conf的配置
- 记得在每次修改后重启dns