這些天做HBase,但是遇到Hbase連接上之后讀取數據的時候,一直卡在那兒,程序既不報錯也不結束,讓我好生糾結,困擾我一整天。現在問題終於解決,現在寫了一段Demo代碼,具體如下:
public static void main(String[] args) throws IOException { System.setProperty("hadoop.home.dir", "f:/hadoop/hadoop-common-2.2.0-bin-master"); conf = new Configuration(); conf.set("hbase.zookeeper.quorum", "192.168.179.216,192.168.179.215"); conf.set("hbase.zookeeper.property.clientPort", "2181"); conf.set("zookeeper.znode.parent", "/hbase"); try { // establish the connection to the cluster. Connection connection = ConnectionFactory.createConnection(conf); // retrieve a handle to the target table. table = connection.getTable("MyTable"); Scan scan = new Scan(); System.out.println("Scan object instantiated"); ResultScanner scanner = table.getScanner(scan); System.out.println("ResultScanner object instantiated"); for(Result res: scanner){ System.out.println(Bytes.toString(res.getRow())); System.out.println("Next iteration"); } } catch (IOException e) { e.printStackTrace(); } finally { // close everything down if (table != null) table.close(); if (connection != null) connection.close(); } }
在我的實際項目中,當程序執行到table = connection.getTable("MyTable")
時,程序就一直卡在那兒,也不報任何錯誤。我束手無策,但是任務很多也很着急我不得不想盡一切辦法來解決,於是我陷入了深深地思考,這個過程是及其痛苦的….
我寫了測試類,找出log,忍着一句一句往下看,終於看到程序一直在不斷的進行連接,一直不停的重試,突然讓我明白或許是我的hosts配置有問題,導致程序解析主機名出現錯誤,一直重新連接嘗試。簡單來說就是hosts文件中配置的主機名和真實主機名不一致,並且還加入了額外的hosts配置信息干擾到了正確解析主機名。
因此我運行demo程序的工作機沒有配置任何額外的hosts,連接ZooKeeper時直接使用的IP地址,但是HBase Client 底層在進行操作時可能引入了主機名反向連接,作為完全干凈的工作機當然找不到對應的服務器,就不斷地在后台重試導致生成了上述的日志。當我把出現問題的兩個hosts記錄加入到工作機后,問題解決。折騰了一天終於就這么點問題,終於搞定。
通過上述錯誤可知,Hadoop集群中hostname一定要與hosts文件中配置的名稱一致,並且力求保證集群映射關系的純凈,不要把其他不相干的業務也部署在其中,引起不必要的麻煩。