问题:

最近发现HBase集群出现1W+ 的region处于RIT状态,导致很多hbase集群处于不可用状态。

HBase版本:

2.0.1

问题定位:

1、刚开始以为只是单纯超时等导致的RIT,于是通过脚本手动修改meta表状态(ING->CLOSED),再滚动重启hbase regionserver和master服务,最后批量assign,结果发现RIT情况并没有解决。(没有hbck工具,只能手动搞)

2、手动assign ‘region’提示超时。大量的assign操作的procedure处于awaiting状态。手动强制停止procedure也是无效(abort_procedure)。于是感觉事情并没有那么简单。

3、在procedure页面找到procedure的进程号,在master日志中搜索,查找procedure操作为什么卡住。最终发现提示找不到这个region的描述文件。再到hdfs上一看,整个表的目录都没了,自然就无法上线region了(业务删表时只删除了HDFS表目录导致!!!)。

解决方案:

那问题找到了,解决就很简单了:直接把hbase:meta中记录的元数据信息全部删掉就可以了。但是在实际操作时发现很难搞:表太多了,没法批量删(后期统计共将近2000个表,1W+的region,且这部分表表名为前缀+时间戳,无法提供具体表名)。

基于上述问题,只能写个脚本获取下全部的表名啦。具体脚本如下:

1、获取所有RIT的表行键
echo "scan 'hbase:meta',{COLUMNS=>'info:state'}" | hbase shell -n | grep -E 'ING|OFFLINE|CLOSED|OPEN' > meta.txt

2、通过meta.txt获取   命名空间:表名
cat meta.txt | awk -F "," '{print $1}' > table_name_and_namespace.txt

3、通过脚本获取表名  
sh get_table_name.sh > meta_table_name_tmp.txt

--------------------------------------------------
#!/bin/bash
#这里主要处理wz命名空间下的表(客户的表都是wz空间下的)

cat table_name.txt | while read line 

do
#echo $line 
res1=`echo $line | awk -F ":" '{print $1}'`
res2=`echo $line | awk -F ":" '{print $2}'`
if [ "$res1" == "wz" ];then
  echo $res2
fi

done
--------------------------------------------------

4、表名去重
uniq meta_table_name_tmp.txt > meta_table_name.txt

5、获取hdfs指定路径下所有表名(/apps/hbase/data/data/wz中的wz使用实际的命令空间),这里7和8根据实际情况变化,/opt/ceshi/hdfs_table_name.txt权限为777; 
hdfs dfs -ls /apps/hbase/data/data/wz | awk '{print $8}' | awk -F "/" '{print $7}' >  /opt/ceshi/hdfs_table_name.txt

6、两边对比,找出被删除的表名
sh diff.sh

--------------------------------------------------
#!/bin/bash

cat meta_table_name.txt | while read line 

do 

flag=`grep -c $line hdfs_table_name.txt`
if [ $flag -eq 0 ];then
  echo $line
fi

done
--------------------------------------------------

7、随机挑几张表验证下,结果是否正确,看是否确实在hdfs端被删除

知道表名后,就可以通过scan元数据表,获取所有需要删除的行键,再通过deleteall命令删除脏数据啦。

1、获取行键
echo " scan 'hbase:meta'" | hbase shell -n | grep -E 'table:state|info:state' | grep -E ' table_name1,|table_name2,|…|..| table_nameN,' > zangshuju.txt

2、删除脏数据
for line in `cat zangshuju.txt |awk '{print $1}'`;do echo " deleteall 'hbase:meta',\"$line\" ";done | hbase shell -n

最后,停止2个hbase master服务,再启动。就可以看到RIT完全消失啦。

总结:

很明显,本次RIT问题产生的原因是使用方式不规范导致,后期需要将删表逻辑改为disable+drop(推荐)。或者删除HDFS表数据的时候,顺带把元数据也删除了。