HBase2.X运维常见RIT修复方式及批量脚本

本文整理了HBase运维常见的几种RIT现象及修复方式,也整理了一些批量修复脚本。
集群里面出现的部分内容主要是以腾讯云EMR产品为主。

常见 RIT 问题修复

问题一、hbase2.X 版本 master 无法启动

查看 master 日志有以下报错:

regionserver.HRegion: Failed initialize of region= master:store,,XXXX., starting to roll back memstore
java.io.EOFException: Cannot seek after EOF

无法初始化某个 region,说明 region 文件有损坏,将损坏的 region 文件移走即可。
操作方式:

hdfs dfs -mv /hbase/MasterData/data/master/store /tmp

问题二、hbase2+版本删表卡住

如存在 RIT,清理 RIT

2.2 版本

hdfs dfs -mv /hbase/MasterProcWALs/* /tmp

重启 activite master
2.3 以上版本

暂停两个 master

hdfs dfs -mv /hbase/MasterData /tmp

启动 master

不存在 RIT,手动删表

步骤一:清理 meta 中的表信息

清理 meta

echo "scan 'hbase:meta',STARTROW => 'resource_data_gather:device_attribute_1',STOPROW => 'resource_data_gather:device_attribute_2'" | hbase shell > mete.txt

sed 's/column.*//g' mete.txt > mete1.txt
sort -n mete1.txt | uniq > mete2.txt
grep -v '^\s*$' mete2.txt > mete3.txt

#脚本
for id in `cat $1`; do
echo $id
echo "deleteall 'hbase:meta','$id'" | hbase shell
done
#Printing the combined values
#echo "$lang"

#执行
sh c.sh mete3.txt

步骤二:清理 zk

清理 zk

hbase zkcli
rmr /hbase/table/TableName

步骤三:清理 hdfs 的上的目录

清理 HDFS 上的目录

hdfs dfs -mv /hbase/data/NameSpace/TableName /tmp

问题三、closing 状态的 rit 修复

优先判断 closing 状态的 region 是否有异常,常见的异常就是 HFile 异常。

先去 Region 所在的目录下查看,是否有引用文件,如有,根据引用文件查看父引用文件是否存在。

如果验证 Region 无异常,那就是 Region 太大,closing 需要时间,耐心等待即可。

如果验证 Region 有异常,那就解决异常。异常处理后,通过以下步骤恢复:

  1. bypass 现在的锁
  2. unassigns + assigns
    复现流程
1、下线 region
unassign 'TestTable1,,1648113751648.97ddc3b3088206c89f2df31c04862053.'
2、重启该 region 之前所在的 rs(startcode 会更新为更大的时间戳)
3、修改 meta 表中该 region 的状态为 OPEN 或 OPENING
put 'hbase:meta','TestTable1,,1648113751648.97ddc3b3088206c89f2df31c04862053.','info:state','OPEN'
4、重启 master
5.hbase hbck -j hbase-hbck2-1.0.0.jar unassigns -o 97ddc3b3088206c89f2df31c04862053

手动复现的方式就是打乱状态不一致的情况。
恢复方式:

hbase hbck -j hbase-hbck2-1.2.0.jar bypass 进程 id
hbase hbck -j hbase-hbck2-1.0.0.jar unassigns regionID
hbase hbck -j hbase-hbck2-1.0.0.jar assigns regionId

进程 ID 可以在这儿查看。
图片

问题四、opening 状态的 rit 修复

现象:

图片

出现的原因类似 closing 状态的 rit。也可以通过对应的的 rs 上通过日志查看无法 open 的原因。

修复流程

hdfs dfs -mkdir -p /tmp/TestTable/info
hdfs dfs -mv /hbase/data/default/TestTable/903a07deea1453db8519e605bc71f688/info/* /tmp/TestTable/info/
hbase hbck -j hbase-hbck2-1.0.0.jar bypass -r -o 102
hbase hbck -j hbase-hbck2-1.0.0.jar assigns -o 903a07deea1453db8519e605bc71f688
hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles /tmp/TestTable/ TestTable

问题五、FAILED_OPEN、FAILED_CLOSED 状态的 rit 修复

出现的原因和以上类似,修复方式参考上面的修复方式。

问题六、OPEN 状态的 region 修复

说明:以下操作风险比较高,非在线十分紧急业务建议慎用

 1.当前集群有大量 rit,并且 rit region 存在锁
 2.任意一台 core 节点执行使用 hadoop 账号执行
 hbase2.2 版本
 hdfs dfs -mv /hbase/MasterProcWALs/* /tmp
 重启 activite master
 hbase2.3 以上版本
 暂停两个 master
 hdfs dfs -mv /hbase/MasterData /tmp
 启动 master
3.使在任意一台 core 节点用 hadoop 账号执行以下内容
 hbase hbck > hbck.log
 grep "not deployed on any region server" hbck.log > notDepoly
 grep "=>" notDepoly | awk '{print $6}' > regionTmp
 sed -i 's/.$//' regionTmp
 sed -i "s/^/&put 'hbase:meta',\"/g" regionTmp
 sed -i "s/$/&\",'info:state','OFFLINE'/g" regionTmp
验证 regionTmp 文件中每行的内容如下
put 'hbase:meta',"dps_mtl:tblMtl9e00aad1642838270653.615337132a570e3f446144aee5e4dcc3.",'info:state','OFFLINE'
确认没问题后将 region 中的命令复制在 hbase shell 执行即可
若在 hbase shell 里执行卡主,证明此时 meta 表所在的 regionserver 的 handler 被打满
在 web ui 找到 meta 表所在 regionserver,在控制台查看 RPC Handler 和 RPC 队列请求数,确认是否有积压
若有,快速重启该 regionserver,再在 hbase shell 里执行 region 文本中的内容

4.切换 master 即可

问题七、meta 表的 rit 修复

hbase 2.4.5 版本,meta 表的 RegionId 可以通过 master 日志查看。

hbase hbck -j hbase-hbck2-1.0.0.jar assigns -o 1588230740

怎么确认 meta region 不在线

  1. hbase hbck 无法执行
  2. 进 hbase shell 里执行命令,卡主或报错
  3. 查看日志

问题八、namespace 等其他元数据表的 rit 修复

namespace 的修复方式和 meta 的修复方式一样。

问题九、region 在多个 RegionServer 上 open 问题

hbase hbck 会出现 multi assign 的错误

  1. kill 掉重复 region 集中比较多的 rs,造成 rit,然后删除 master ProceWAls,重启 master 即可
  2. move region,移动到不属于 meta 里的那个 regionserver,造成 rit,然后重启这个 regionserver
    比如 region 在 1.1 和 1.2 上,meta 里在 1.1 上。移动 region 到 1.2,造成 rit,然后重启 1.2 即可

问题十、 表粒度修复

使用场景,出现 rit 的表比较多,需要快速修复重要的表

table 粒度

hdfs dfs -ls /hbase/data/default/H_WX_STATS_V2 > region.txt
grep -v 'tmp' region1 > region1.txt
grep -v 'tabledesc' region1.txt > region2.txt

grep "hbase" region2.txt | awk '{print $8}' > region3.txt
awk -F '[-/]' '{print $6;}' region3.txt > region4.txt
sed -i '/^\./d' region4.txt

for region in 'cat /usr/local/service/hbase/region4.txt'; do
echo $line
./bin/hbase hbck -j hbase-hbck2-1.0.0.jar assigns -o $line
done

修复 RIT 使用到的脚本

脚本一、 批量 bypass 脚本

#获取当前 jmx 上的 lock id
#hbase2.2.0
grep "ID =>" jmx | awk '{print $6}' > lockId
#hbase 2.3+
grep "pid=" jmx | awk '{print $3}' > lockId
sed 's/\,//g' lockId > lockId1
sed -i $'s/\'//g' lockId1
cat lockId1 | cut -d '=' -f2 > lockId12

批量 bypass 脚本
#Initializing the variable before combining
lang="/usr/local/service/hbase/bin/hbase hbck -j hbase-hbck2-1.0.0.jar bypass -r -o "
#for loop for reading the list
for id in `cat $1`; do
lang+="$id " #Combining the list values using append operator
done
#Printing the combined values
echo "$lang"

执行
sh a.sh lockId1 > by.sh

执行
sh by.sh

其中 jmx 是复制绿色框的内容,一直复制到 web 底部,保存到文件中

若点击 Procedures & Locks 报错,重启下当前的 activite master,点击新 master 的这个界面即可打开