phoenix4.9 在hbase進行compaction後出現zookeeper連接泄漏問題

        最近開發環境使用過程當中遇到hbase RegionServer 存在過多的zookeeper連接,出先連接泄漏問題。通過jmap命令查看內存信息發現是在zookeeper連接被HRegion當中某些對象保存起來沒有釋放掉,使用jstack查看當前進程堆棧信息,發現compaction調用了phoenix中代碼,如圖所示


查找源碼發現在DefaultStatisticsCollector類的initGuidepostDepth出代碼爲


htable是HTableInterface的實現類對象,查看源碼發現該對象在創建時需要生產一個RegionCoprocessHConnection對象,該對象父類HConnectionImplementation當中引用了類ZookeeperKeepAliveConnection 對象引用,該類是hbase對zookeeper的封裝類,調用HConnectionImplementation當中的getKeeperAliveZookeeperWatcher方法後會將ZookeeperKeepAliveConnection 類的引用實例化併產生zookeeper連接。

        htable.get(get) 方法經過一系列調用後最終會調用HConnectionImplementation中的getKeeperAliveZookeeperWatcher產生一個zookeeper連接,但是最後並未釋放該連接,進行compaction後不斷的產生zookeeper連接,導致出現連接泄漏。

DefaultStatisticsCollector 類是phoenix-hbase-4.9.0-server.jar包當中一個類,該問題在最新phoenix-hbase-4.10.0-server.jar包當中已經修復,解決問題方法比較簡單,就是在使用完畢後調用htable.close()方法,該方法最終會調用HConnectionImplementation.shutdown()方法,將連接釋放掉。 (注意,不要調用ZookeeperKeepAliveConnection類對象本身的close()方法,該方法某些情況下並不會真正的調用實際的釋放邏輯,可能無法釋放連接)

該問題需要在設置表分區較多的情況下容易復現,表分區較少情況下問題不是非常明顯,連接泄漏問題查找起來真的是相當頭痛啊。

Phoenix相關問題BUG連接:https://issues.apache.org/jira/browse/PHOENIX-3553

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章