集群机器意外断电重启,导致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