前言:本文记录了一些我处理生产hbase各种异常情况的经验,以下列举各种问题,以及问题对应的解决办法,在生产环境有参考价值
注意:
1.本文hbase为2.0.2版本,其他版本的修复工过程可能不同
解锁Procedures有哪些方法?
一般Procedures程序会在master节点重启时再运行一遍,解决Procedures程序的报错,是解锁Procedures最好的办法,降低避免数据不一致的风险
高版本的hbase可优先使用hbck2进行解锁 ,百度可以搜索出来,支持2.0.3和2.1.1
版本hbase可以通过多次重启master的方式触发Procedures归档的程序
低版本hbase可以通过删除hdfs中Procedures文件来解锁
重启集群时,如果报错hbase:meta表不在服务器上,导致集群无法启动如何解决?(如下图)
查看日志:报错异常栈中存在migratezookeeper这个程序,提示meta region is in state opening。并且该报错会可能重复出现,一直再刷,还可能会伴随[org.apache.hadoop.hbase.client.RpcRetryingCaller] Call exception 之类的报错
解决办法:可以使用尝试删除zk中节点meta-region-server和table下的所有节点,然后重启master,该报错即可解决。被删除的zk节点会被master程序重建
重启集群时,报错namespace不在服务器上,导致集群无法启动如何解决(如下图)?
可能会有报错namespace is not online on {服务器名称}
可能会有报错[org.apache.hadoop.hbase.client.RpcRetryingCaller] Call exception
master启动的时候需要读取hbase:namespace表,请求不到其他regionserver的话就无法启动
修改元数据表,使得namespace表状态为离线,如下命令
put 'hbase:meta' ,'hbase:namespace,,1577418002600.769b4d77f8d07c20063310195c8ea505.' ,'info:state','OFFLINE'
(注意这个命令里的加粗部分value是需要你修改的,先get命令看看)
重启master节点即可解决
报错业务表region不在服务器上的解决办法(如下图)?
报错 {region} is not online on {服务器名称}
可能会有报错[org.apache.hadoop.hbase.client.RpcRetryingCaller] Call exception
-
检查hbase:meta表,该region中sn和server的列族数据是否是同一个服务器,不是的话需要修改为相同服务器,然后重启master
-
如果该region在Procedures程序上锁了,先解锁
-
方法一:如果region数量比较少,先使用命令unassign,再assign
-
方法二:如果region数量比较多,使用命令disable再enable
-
方法三:修改元数据表,将region改为offline(该方法可能需要重启整个集群)
hbase表处于"正在打开"或"正在关闭"的中间状态,无法进行操作的解决思路(如下图)?
-
无论是正在打开或者正在关闭,都需要修改元数据使得表状态为已开启,使用语句
put "hbase:meta","表名称","table:state",value="\x08\x00"
-
重启master加载元数据表
-
使用disable对表进行操作
-
使用enable对表进行操作
-
修复成功
如何判断一张表的所有region已修复成功,可正常使用?
-
数据量比较少,可使用scan命令
-
数据量比较大,全表扫描的命令hbase org.apache.hadoop.hbase.mapreduce.RowCounter 'tableName'
-
使用hbaseRegion扫描工具
使用修复工具修复元数据表后,如何判断是否有regin不在线?
-
手动执行自动均衡命令,如果报数组越界的错误,说明有regin不在线
-
查看日志,发现自动均衡程序报错数组越界,说明有regin不在线
-
程序全局扫描
自动均衡报数组越界的错误,导致自动均衡功能失效如何解决(如下图)?
arrayIndexOutofBoundSexcExecptiom
-
检测集群的所有表的所有region是否已正常部署再服务器上
-
对没有被正常部署的region进行重新部署
-
如果检查时暂时无法发现那个region不在服务器上,那就一个个表进行disable操作,直到可以执行自动均衡命令为止
报错文件找不到,导致region无法加载,无法读写该region,如何解决?
解释:hadoop里全局搜索找不到的文件的名称,会发现很多形如xxx.xxx的引用文件,只有十几个字节的大小,一般这种情况出现在硬盘资源不够的情况下,启动宕机的hbase集群时容易出现
-
可能是引用文件找不到源文件造成的
-
删除报错region下的所有无用的引用文件(有争议的操作,可能造成部分数据丢失)
-
重启master节点
hbase的RIT问题的一般解决思路:
-
处理Procedures程序报错的问题
-
将元数据表中相关的信息进行修改,可以用修复工具或者手动修改,一般先把状态改为closed
-
重启master
-
先unassign然后assign或者进行disable\enable操作,使得region正常上线
启动hbase的master节点提示切分wal日志失败,由于切分wal失败了,master节点无法启动。且regionserver不停的刷新regionserver没有datanode的节点执行操作的日志:
解决办法是采用小米hbase团队的切割wal日志的办法,在hbase的master节点的配置文件加上一下配置,然后重启master
<property>
<name>hbase.split.writer.creation.bounded</name>
<value>true</value>
</property>