HBCK2修复RIT实践笔记
本文记录了作者使用HBCK2工具对线上HBase发生RIT状态的处理,仅供参考,若有疵漏,还望指正。
网络上关于HBCK2的文章很少,基本都是复制粘贴自田竞云(小米)的这一篇:HBase指南 | HBase 2.0之修复工具HBCK2运维指南
事实上这一篇文章介绍得也已经很详细了。这里只是做一些实践上的补充说明。
1. 下载
直接去hbase的官网下载地址里就可以找到。这里直接给最新版本的下载链接(截止至2020年4月):https://downloads.apache.org/hbase/hbase-operator-tools-1.0.0/hbase-operator-tools-1.0.0-bin.tar.gz
但还是推荐自己去git clone编译,因为官网提供的编译版本有滞后性。通常来说,使用最新版本的hbase再搭配使用最新编译的HBCK2,可以解决绝大部分莫名其妙的问题。(fixMeta+restart暴力流)
新版本的HBCK2有更多更方便的功能,不过一般只能在新版本的hbase中使用。
2. 使用命令
将其解压后得到 hbase-hbck2-1.0.0.jar,再cp到$HBASE_HOME/lib下,执行 hbase org.apache.hbase.HBCK2 <命令> 即可,第一次使用推荐 hbase org.apache.hbase.HBCK2 -h 查看详细介绍
使用方法
1. 查找问题
参考HBCK2运维指南的思路:
graph LR
A(canary tool)--> B(Procedures & Locks 页面状态)
B --> C(RIT队列)
C --> D(Master日志)
2. 实践例子
处理Procedures & Locks
在 Procedures & Locks 页面查找waiting状态的procedure,按顺序进行bypass。按顺序是因为有一些waiting的发生是procedure存在依赖关系,将其bypass后后面的procedure会进入success状态。如果bypass返回false就使用bypass -r,还是不行再使用bypass -or处理RIT队列
参考HBCK2运维指南可以以txt格式拿到RIT队列的所有procedure的id,将其复制到任意文件(如pid.txt),再执行以下命令即可1
cat pid.txt | xargs hbase org.apache.hbase.HBCK2 bypass -or
然后再以txt格式拿到RIT队列的所有region的encodedName,将其复制到任意文件(如region.txt),再执行以下命令即可
1
cat region.txt | xargs hbase org.apache.hbase.HBCK2 assigns
assign各个表中offline的region
检查一下各个表中是否有region的StorefileSize为0,当然也可能是本身没有存储多少数据,要注意辨别。这种一般对其assigns就可以了。对于一些大表可能有上千个region的,一个个甄选未免太浪费时间,可以直接在web界面将其region区域全部拷贝下来,复制到txt,使用下述命令进行筛选
1
cat regions.txt |grep -v 'GB' |grep -v 'MB' > region2.txt
高版本的hbase有hbck记录页,去页面查看,根据提醒操作就行,更方便
使用以下Java代码即可提取出encodedName
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19@Test
public void printRegionEncodedName() throws IOException {
List<String> lines = FileUtil.readUtf8Lines("C:\\tmp\\region2.txt");
List<String> regionEncodedNameList= Lists.newArrayListWithExpectedSize(lines.size());
for (String line : lines) {
if(StringUtils.isBlank(line)){
continue;
}
int point1=line.indexOf(".") ;
int point2=line.indexOf(".", line.indexOf(".")+1);
String s = line.substring(point1+1, point2);
System.out.println(s);
regionEncodedNameList.add(s);
}
System.out.println("size:"+regionEncodedNameList.size());
try (PrintWriter pw = new PrintWriter(new FileWriter("C:\\tmp\\encodedName.txt"));){
regionEncodedNameList.forEach(regionEncodedName->pw.println(regionEncodedName+" "));
}
}然后又是 cat encodedName.txt | xargs hbase org.apache.hbase.HBCK2 assigns 就可以了
如下,一次性对大量region进行操作
3. 注意事项
对procedure执行bypass后其状态会由waiting转换为success(bypassed),但不会立即移除出rit队列。可通过重启master解决。