最近发现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表数据的时候,顺带把元数据也删除了。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)