由MasterProcWals状态日志过多导致的HBase Master重启失败问题
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 中。