HBase STUCK Region-In-Transition问题
产生原因
HBase2.x的Procedure是记录了HBase的各种操作,比如创建表、删除表、禁用表。当他出现不一致的时候可能就会导致STUCK Region-In-Transition。
解决方案
HBase2.x已经有了相当先进的修复工具hbck2,但是这个修复工具试基于HbckService
类来完成的,而HBase2.x并不是所有的版本都含有这个类,比如2.0.3之前和 2.1.1之前的版本。点击下载hbck2
使用方法 - 比如想让某个procedure 无论是否成功都当作执行成功为procedure的id
更多的用法请参考官网
hbase hbck -j hbase-hbck2-1.0.0-SNAPSHOT.jar bypass -o <PID>
当你的HBase版本刚好是这些不支持Hbck2的版本的时候就更无奈,因为Hbck2的介绍说,HBase2.x和Hbase1.x版本变化是很大的,因此hbck1不能进行修复Hbase2.x,如果你这个做了,可能会导致一些未知的错误。
我的HBase版本为2.1.0,刚好不支持hbck2,我卡住的地方为删除一张表。因此我只需要从集群中删除一些数据就可以。我的步骤如下,如果你卡住的地方不是删除表请不要模仿。
- 删除该表对应的hdfs数据。
- 删除该表对应的
hbase:meta
中关于这个表的数据。 - 关闭Hbase集群,然后将hdfs中
/hbase/MasterProcWALs
数据移动另一个目录,注意不要把这个目录移走,仅仅移走目录下的内容。 - 启动集群。
启动之后发现卡住的地方已经好了,但是要搞清楚为什么卡住,以后注意,防止下次被卡住的情况发生。
删除meta表的部分数据我使用的为代码,代码如下.注意我的表名为 cdr201908
package cdr;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.filter.PrefixFilter;
import org.apache.hadoop.hbase.util.Bytes;
import java.util.Iterator;
import java.util.LinkedList;
public class Fix201908 {
public static void main(String[] args) throws Exception {
System.out.println("创建链接中...");
Configuration configuration = HBaseConfiguration.create();
Connection connection = ConnectionFactory.createConnection(configuration);
Table table = connection.getTable(TableName.valueOf("hbase:meta"));
PrefixFilter prefixFilter = new PrefixFilter(Bytes.toBytes("cdr201908"));
Scan scan = new Scan();
scan.setFilter(prefixFilter);
ResultScanner scanner = table.getScanner(scan);
LinkedList<Delete> deletes = new LinkedList<>();
int count = 0;
Iterator<Result> results = scanner.iterator();
while(results.hasNext())
{
Result result = results.next();
for(Cell kv: result.listCells())
{
String s1 = new String(kv.getRowArray(),kv.getRowOffset(),kv.getRowLength());
byte[] key = new byte[kv.getRowLength()];
System.arraycopy(kv.getRowArray(),kv.getRowOffset(),key,0,kv.getRowLength());
if(Bytes.toString(key).startsWith("cdr201908")){
System.out.println("rowkey:" + new String(key));
Delete delete = new Delete(key);
deletes.add(delete);
count += 1;
}
}
}
table.delete(deletes);
System.out.println("---------------------------------------------");
System.out.println(count);
System.out.println("---------------------------------------------");
scanner.close();
table.close();
connection.close();
}
}