前言
在Ubuntu上搭建Hbase集群后鲸湃,用hbase shell命令可以正常訪問集群赠涮;但是,在本地用java客戶端連接Hbase集群時暗挑,連接不上hbase數(shù)據(jù)庫,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]
【發(fā)現(xiàn) ** 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地址與域名對應(yīng)關(guān)系【很關(guān)鍵的一步】
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 設(shè)置權(quán)限
- chmod 664?db.11.168.192
- chmod 664?db.artemis-02
- chmod 664?named.conf.default-zones
2.4 重新啟動
2.5 測試
利用命令nslookup測試
3 需要注意的地方
- 第一次創(chuàng)建db.11.168.192文件時也殖,我用的名稱是db.192土思,結(jié)果發(fā)現(xiàn)不成功,則只好修改為db.11.168.192
- 權(quán)限的問題忆嗜,需要注意
- 修改resolv.conf的配置
- 記得在每次修改后重啟dns