hadoop hbase集群斷電數(shù)據(jù)塊被破壞無法啟動
集群機器意外斷電重啟,導(dǎo)致hbase 無法正常啟動,拋出reflect invocation異常,可能是正在執(zhí)行的插入或合并等操作進行到一半時中斷,導(dǎo)致部分數(shù)據(jù)文件不完整格式不正確或在hdfs上block塊不完整。
在網(wǎng)上查了一下相關(guān)資料,懷疑有可能是關(guān)閉前一些未提交的修改所存放的log文件數(shù)據(jù)寫入一半文件不完整,故把hbase.hlog.split.skip.errors改成true進行嘗試。
關(guān)于這個參數(shù)作用的解釋:
當(dāng)服務(wù)器奔潰,重啟的時候,會有個回放的過程,把/hbase/WAL/下面記錄的log都回放一遍,合并到每個region中,回放過程中如果有error發(fā)生,這個參數(shù)又是false,那么exception就會向外層輸出,回放失敗。
但是很遺憾,將此參數(shù)修改后hbase集群仍然無法正常啟動。
然后就琢磨其他原因,先觀察hbase啟動時的60010監(jiān)控頁面,
發(fā)現(xiàn)部分region FAILED_OPEN錯誤,its007-meta表一共200個region,只啟動成功199個。
似乎想到了什么,對了,很可能是這個region的數(shù)據(jù)文件格式不正確,那就先檢查一下其在hdfs上的文件是否正常。
果不其然,觀察hadoop的50070頁面,會提示hadoop文件系統(tǒng)的具體路徑上有兩個數(shù)據(jù)塊出錯。
(關(guān)于hbase在hdfs上的目錄相關(guān)文章鏈接:HBase在HDFS上的目錄樹)
解決方法:
1. 運行hadoop fsck / -files檢查hdfs文件
2. 發(fā)現(xiàn)/hbase/oldWALs目錄下有一個文件損壞,
運行hadoop fsck / -delete清除損壞的文件
3. 運行hbase hbck -details查看hbase概況,發(fā)現(xiàn)Table its007-meta有一個region加載失敗
4. 運行hbase hbck -fixMeta嘗試修復(fù)系統(tǒng)元數(shù)據(jù)表
5. 運行hbase hbck -fix嘗試修復(fù)region數(shù)據(jù)不一致問題。
6. 再次運行hbase hbck -details發(fā)現(xiàn)問題仍然未修復(fù),那個region仍然加載失敗。
故直接將該region下出錯的文件移走,暫時移至hdfs根目錄
hadoop fs -move /hbase/data/default/its007-meta/fe6463cba743a87e99f9d8577276bada/meta/9a853fdbe13046fca194051cb9f69f9b /
fe6463cba743a87e99f9d8577276bada是region的名字
9a853fdbe13046fca194051cb9f69f9b是region下出錯的HFile,有800k大小(注:一個region下可以有多HFile)
7. 運行hbase hbck -fix重新加載之前失敗的region,至此完成修復(fù),丟棄了出錯的HFile
總結(jié):
hbase在hdfs上一共兩個文件損壞。(關(guān)于hdfs文件寫入相關(guān)文章:hdfs文件寫入相關(guān)概念)
一個是oldWALs下的,這個是存放一些沒用的HLog文件的,這里有文件損壞,說明從WALs中轉(zhuǎn)移沒用的HLog寫到oldWALs下時,寫了一半斷電導(dǎo)致hdfs上文件數(shù)據(jù)塊出錯;
另一個是region下一個HFile文件損壞,這個文件800k比較小,應(yīng)該是從Memstore flush到HFile時,寫了一半沒寫完導(dǎo)致其在hdfs上的文件數(shù)據(jù)塊出錯。
hbase region數(shù)據(jù)塊出現(xiàn)問題可以先修復(fù)
查看hbasemeta情況
hbase hbck
1.重新修復(fù)hbase meta表
hbase hbck -fixMeta
2.重新將hbase meta表分給regionserver
hbase hbck -fixAssignments
如果修復(fù)失敗,我們可以刪除hdfs上的異常數(shù)據(jù),刪除META表中對應(yīng)的region信息。