具體錯誤
hbase:meta,,1.1588230740 is NOT online; state={1588230740 state=OPEN, ......
?使用 hbase 2.5.5 ,hdfs和hbase分離兩臺服務器。
總過程
1. 問題發現
在使用HBase的程序發出無法進行插入到HBase操作日志后檢查HBase狀況。發現master節點和region節點都掛了,HBase自動切換到備用master節點。關閉備用master節點,重新啟動HBase集群,WEB界面發現上一次啟動的節點在Dead Region中不自動清除,且Region Transition卡住了395條,看日志發現master節點一直在拋出is not online on ...,16020,1569380560106異常,確認HBase沒有正常運行。
檢查日志發現主節點拋出如上錯誤。
2. 解決過程
2.1 is not online on ...,16020,1569380560106異常
重啟觀察到Dead Region每次會增加,感覺應該是HMaster初始化中重啟導致的狀態問題。之前測試環境解決這個問題是清空zookeeper和hdfs的hbase相關信息,但是因為有數據不希望清除,考慮解決該問題。
先去hdfs節點檢查hbase文件有沒有損壞的情況。
hdfs fsck
輸出未發現數據塊損壞的情況。?搜索后確認為hbase內部問題。搜索得到hdfs的hbase路徑下WALs保存regionserver節點的信息,遂考慮清空重啟看看能不能解決這個問題。
hdfs dfs -mkdir /hbase/WALs20240521hdfs dfs -mv /hbase/WALs/* /hbase/WALs20240521
運行后問題依舊存在,檢查日志后猜測是找不到某個節點的信息導致HMaster節點無法正常初始化。在WALs中新建了一個空白的hbase:meta找不到的1,16020,1569380560106文件夾,再次重啟后HMaster恢復正常,多余的Dead Region在等待三四分鐘后自動清除,HBase恢復正常運行。
2.2 出現了數據缺失的情況
在HBase恢復正常后,在HBase Web UI中的HBCK REPORT發現大量的Incontinent Regions和Unknown Servers信息,懷疑是數據有問題,在使用自己的業務程序測試后發現有部分數據的請求在master節點會拋出類似于 [表名],[rowkey],[encode]在region2.16000,[encode]這里不存在,region2,16000,[encode]不在線。
初期懷疑是數據損壞了,希望通過HBCK進行修復region的hole問題,因為是2代所以從GIT上拉相關工具,官網上獲取的。可能在運行 hbase hbck -j xxx.jar 后會拋出沒找到文件系統 hdfs 的錯誤,可以加上 --internal-classpath來解決這個問題。我是因為hdfs 和 hbase 不在同一個服務器上,也可以通過添加環境變量HADOOP_HOME來解決這個錯誤。
首次使用fixMeta來嘗試修補表中的holes解決文件損壞問題。
hbase hbck -j xxxx.jar fixMeta
運行后觀察master節點的日志,發現返回了hbase:meta中發現的holes為0,排除了數據損壞的情況。焦點回到unknown servers上。
hbase hbck -j xxx.jar scheduleRecoveries [encode]
恢復崩潰的 RegionServer 上的所有 region。
3. 過程中用到的指令
hbase hbck -j xxxx.jar -o assigns [encode] # 分配Region in transition中卡住的任務
hbase hbck -j xxxx.jar bypass [pid] # 將producer中的強行釋放,在任務卡住的時候可以用
hbase hbck -j xxxx.jar fixMeta # 修復hbase:meta的問題,需要程序正常運行
結語
僅為在網絡上找到的一些方法和自己踩的坑,肯定有錯誤的地方,希望可以指正,謝謝。具體命令可以在HBCK2項目中的README.md中詳解。