來源:互聯網
上載者:User
關鍵字
安全模式
safemode
HDFS用戶端
HDFSblock丟失
HDFS block丟失過多進入安全模式(Safe mode)的解決方法
背景及現象描述(Background and Symptom)
因磁碟空間不足,記憶體不足,系統掉電等其他原因導致dataNode datablock丟失,出現如下類似日誌:
The number of live datanodes 3 has reached the minimum number 0.
Safe mode will be turned off automatically once the thresholds have been reached.
Caused by: org.apache.hadoop.hdfs.server.namenode.SafeModeException: Log not rolled.
Name node is in safe mode.
The reported blocks 632758 needs additional 5114 blocks to reach the threshold 0.9990
of total blocks 638510.
The number of live datanodes 3 has reached the minimum number 0.
Safe mode will be turned off automatically once the thresholds have been reached.
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.checkNameNodeSafeMode
(FSNamesystem.java:1209)
... 12 more
原因分析(Cause Analysis)*
由於系統斷電,記憶體不足等原因導致dataNode丟失超過設置的丟失百分比,系統自動進入安全模式
解決辦法(Solution)*
安裝HDFS用戶端,並執行如下命令:
步驟 1 執行命令退出安全模式:hadoop dfsadmin -safemode leave
步驟 2 執行健康檢查,刪除損壞掉的block。 hdfs fsck / -delete
注意: 這種方式會出現資料丟失,損壞的block會被刪掉
集群機器意外斷電重啟,導致hbase 無法正常啟動,拋出reflect invocation異常,可能是正在執行的插入或合併等操作進行到一半時中斷,導致部分資料檔案不完整格式不正確或在hdfs上block塊不完整。
在網上查了一下相關資料,懷疑有可能是關閉前一些未提交的修改所存放的log檔資料寫入一半檔不完整,故把hbase.hlog.split.skip.errors改成true進行嘗試。
關於這個參數作用的解釋:
當伺服器奔潰,重啟的時候,會有個重播的過程,把/hbase/WAL/下面記錄的log都重播一遍,合併到每個region中,重播過程中如果有error發生,這個參數又是false,那麼exception就會向外層輸出, 重播失敗。
但是很遺憾,將此參數修改後hbase集群仍然無法正常啟動。
然後就琢磨其他原因,先觀察hbase啟動時的60010監控頁面,
發現部分region FAILED_OPEN錯誤,its007-meta表一共200個region,只啟動成功199個。
似乎想到了什麼,對了,很可能是這個region的資料檔案格式不正確,那就先檢查一下其在hdfs上的檔是否正常。
果不其然,觀察hadoop的50070頁面,會提示hadoop檔案系統的具體路徑上有兩個數據塊出錯。
(關於hbase在hdfs上的目錄相關文章連結:HBase在HDFS上的目錄樹)
解決方法:
1.運行hadoop fsck / -files檢查hdfs檔
2.發現/hbase/oldWALs目錄下有一個檔損壞,
運行hadoop fsck / -delete清除損壞的檔
3.運行hbase hbck -details查看hbase概況,發現Table its007-meta有一個region載入失敗
4.運行hbase hbck -fixMeta嘗試修復系統中繼資料表
5.運行hbase hbck -fix嘗試修復region資料不一致問題。
6.再次運行hbase hbck -details發現問題仍然未修復,那個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,至此完成修復,丟棄了出錯的HFile
總結:
hbase在hdfs上一共兩個檔損壞。 (關於hdfs檔寫入相關文章:hdfs檔寫入相關概念)
一個是oldWALs下的,這個是存放一些沒用的HLog檔的,這裡有檔損壞,說明從WALs中轉移沒用的HLog寫到oldWALs下時,寫了一半斷電導致hdfs上檔資料塊出錯;
另一個是region下一個HFile檔損壞,這個檔800k比較小,應該是從Memstore flush到HFile時,寫了一半沒寫完導致其在hdfs上的檔資料塊出錯。