1,問題描述
(1)在遠程服務器上搭建了個HBase 服務,並且在服務器上使用 hbase shell 命令行工具可以成功進行建表、插入數據、查詢數據等操作。
(2)但是發現在項目中使用 HBase Client 能夠成功與 Zookeeper 連接,卻無法與 HBase Server 連接,錯誤信息如下:

2,問題原因
(1)HBase 啟動之后會將 Master 的信息存儲在 Zookeeper 的 /hbase/master 中,然后 HBase Client 連接到 Zookeeper 后首先會從 Zookeeper 中獲取 Master 的 IP 和端口信息,然后才和 Master 建立連接。
(2)但是 /hbase/master 存儲的可能是一個別名(例如 localhost 或者其他),如果客戶端拿到 localhost 或者其他沒有記錄在 hosts 的別名,那么客戶端將會無法連接到 HBase Server。
(3)從上面截圖可以看到,訪問的別名確實是 hostname=localhost,那么自然無法連接成功。通過 HBase 的 Web UI 也可以看到 Server 確實是 localhost:

3,解決辦法
(1)首先登錄服務器,執行如下命令將主機名字改成 master(改成其他也行,只要不是 localhost)
hostnamectl set-hostname master
(2)接着執行如下命令編輯 /etc/hosts 文件:
vim /etc/hosts
(3)將 127.0.0.1 的別名設置為 master:或者自己外網ip 對應master
(4)保存退出后重啟服務器,可以看到主機名已經變成 master 了:
(5)通過 HBase 的 Web UI 也可以看到 ServerName 也變成了 master:
(6)服務器設置完畢后,本機客戶端的 hosts 文件加上也要加上 HBase 服務器對應的 hosts,這樣客戶端就可以連上 HBase 服務了:
C:\Windows\System32\drivers\etc
81.68.xx.xx master 此處為外網ip
注意如果一直連不上可以注釋掉linux上外網對應 master的映射
127.0.0.1 localhost.localdomain localhost 127.0.0.1 localhost4.localdomain4 localhost4 #81.68.xx.xx master #::1 VM-16-6-centos VM-16-6-centos ::1 localhost.localdomain localhost ::1 localhost6.localdomain6 localhost6