HBase讀取數據卡住長時間不返回的原因分析


這些天做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文件中配置的名稱一致,並且力求保證集群映射關系的純凈,不要把其他不相干的業務也部署在其中,引起不必要的麻煩。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM