1 文檔編寫目的
本文主要講述如何解決由MasterProcWals狀態日志過多導致的HBase Master重啟失敗問題。
測試環境:
操作系統版本為Redhat7.2
CM和CDH版本為5.13.1
文章目錄結構:
1. 文檔編寫目的
2. 問題描述
3. 解決方案
3.1 問題解決
3.2 相關建議
4. 總結
2 問題描述
由於某些已知存在的問題,會導致MasterProcWals狀態日志過多,如果重啟HBase Master,可能會導致HBase Master啟動失敗。因為HBase Master進入活動狀態需要讀取並實例化所有正在運行的程序當前記錄在/hbase/MasterProcWALs/目錄下對應的文件。如果此文件夾太大,HBase Master將在完全變為活動狀態之前超時並崩潰。
問題特征:
1、HBase Master 重啟失敗前,會打印出類似的日志:
2018-07-07 17:43:08,619 INFOorg.apache.hadoop.hbase.util.FSHDFSUtils: Recover lease on dfs filehdfs://nameservice1/hbase/MasterProcWALs/state-00000000000000084815.log2018-07-07 17:43:08,619 INFOorg.apache.hadoop.hbase.util.FSHDFSUtils: Recovered lease, attempt=0 onfile=hdfs://nameservice1/hbase/MasterProcWALs/state-00000000000000084815.logafter 0ms2018-07-07 17:43:08,624 INFOorg.apache.hadoop.hbase.util.FSHDFSUtils: Recover lease on dfs filehdfs://nameservice1/hbase/MasterProcWALs/state-00000000000000084816.log2018-07-07 17:43:08,625 INFOorg.apache.hadoop.hbase.util.FSHDFSUtils: Recovered lease, attempt=0 onfile=hdfs://nameservice1/hbase/MasterProcWALs/state-00000000000000084816.logafter 1ms2018-07-07 17:43:08,630 INFO org.apache.hadoop.hbase.util.FSHDFSUtils:Recover lease on dfs filehdfs://nameservice1/hbase/MasterProcWALs/state-00000000000000084859.log2018-07-07 17:43:08,630 INFOorg.apache.hadoop.hbase.util.FSHDFSUtils: Recovered lease, attempt=0 onfile=hdfs://nameservice1/hbase/MasterProcWALs/state-00000000000000084859.logafter 0ms2018-07-07 17:43:08,678 FATALorg.apache.hadoop.hbase.master.HMaster: Failed to become active masterjava.lang.NullPointerException |
---|
2、查看HBase Master日志,還能看到如下信息:
2018-07-07 17:43:38,978 WARN org.apache.hadoop.hdfs.BlockReaderFactory:I/O error constructing remote block reader. java.net.SocketException: Too manyopen files |
---|
3、通常你能夠在/hbase/MasterProcWALs目錄下看到大量的日志文件,並且這些日志文件占用HDFS存儲空間總和可能已經達到TB級別了。可以通過如下命令查看/hbase/MasterProcWALs目錄占用HDFS存儲空間大小:
hdfs dfs -du -s -h /hbase/MasterProcWALs
注:執行該命令后,我的/hbase/MasterProcWALs目錄大小將近10 TB(不含副本)
3 解決方案
3.1 問題解決
該問題主要和HBase某個分支的實現方式有關,據說已經重新設計了該實現方式,新的實現方式能夠避免該問題,將在CDH 6中應用。
如果出現由MasterProcWals狀態日志過多導致的HBase Master重啟失敗問題建議先將/hbase/MasterProcWALs目錄下的所有文件備份,然后刪除/hbase/MasterProcWALs目錄下的所有文件,重啟HBase Master即可解決問題。
3.2 相關建議
建議啟用HBase Master 日志清除器插件,定時清理日志。

目前默認配置的清除器插件有ReplicationLogCleaner、SnapshotLogCleaner和TimeToLiveLogCleaner這三種:
- ReplicationLogCleaner:如果有跨集群數據同步的需求,通過該Cleaner來保證那些在同步中的日志不被刪除;
- SnapshotLogCleaner:被表的snapshot使用到了的wal不被刪除;
- TimeToLiveLogCleaner:日志文件最后修改時間在配置參數{hbase.master.logcleaner.ttl默認600秒}之前的可以刪除。
4 總結
1、如果MasterProcWals狀態日志過多,那么重啟HBase Master,可能會導致HBase Master啟動失敗。目前臨時的解決方案是備份/hbase/MasterProcWALs目錄下的所有文件后,刪除該目錄下所有文件並重啟HBase Master。
2、建議定時清理MasterProcWals狀態日志,可以通過HBase自帶的清理器插件處理,也可以自己開發日志清理插件,按要求添加到HBase的classpath 中。