HBase Regions In Transition(RIT)问题解决思路及操作方法
问题描述
Java API报错
java.io.IOException: Unable to find region for 2520192391014818087 in $TABLENAME ;
ERROR Utils: Aborting task
org.apache.hadoop.hbase.client.RetriesExhaustedWithDetailsException: Failed 1 action: IOException: 1 time, servers with issues: null
执行hbase shell命令时报错
同时HDP页面显示HBase分配的region全部都是Other Resgions,Online Regions为0:
往下看到:
解决思路
定位到RIP问题原因,并恢复region
临时规避
另创建一张表(不推荐)[1]
根因分析
上次HBase存储空间撑爆导致拒绝服务的问题解决思路与操作方法记录中,我们在HDFS直接删除了HBase表的数据文件,但没有删干净,meta表中还存在该表的数据,触发RIT问题;
ETL任务代码对表进行了truncate操作,api清空表需要先disable,就需要这个表的region有一个从open到close的一个状态转换,由于大量的region出现RIT,导致后续需要状态转换的表也出现了RIT现象;
然后就出现表ENABLING和call queue is full的情况。
出发了RIT问题.
修复方法
方法一:assign
对于还存在的表,可以尝试hbase shell命令
# 恢复region
hbase> assign 'rowkey'
# 查看region状态,应该变成 OPEN
hbase> get 'hbase:meta','rowkey'
# 手动将表的状态从ENABLING恢复为ENABLE,就可以恢复正常使用了
hbase> put 'hbase:meta', 'tablename','table:state',"\b\0" # 注意这里"\b\0"一定要双引号
下面是一些参考链接
https://stackoverflow.com/questions/22098754/inconsistency-in-hbase-tableregion-not-deployed-on-any-region-server
https://stackoverflow.com/questions/11010167/repair-hbase-table-unassigned-region-in-transition
https://serverfault.com/questions/510290/hbase-hbck-cant-fix-region-inconsistencies
方法二:手动删除元数据
对于未被正常删除的表,meta表中的信息就没用了,所以可以直接将rowkey从hbase:meta中删除
hbase> delete all 'hbase:meta' 'rowkey'
本次的RIT有点多且大多都是同一张表,因此考虑用java api批量删除
@Test
public void testScan() throws IOException {
TableName tableName = TableName.valueOf("hbase:meta");
Table table = hbaseConn.getTable(tableName);
List<Delete> deletes = new ArrayList<>();
Scan scan = new Scan();
PrefixFilter prefixFilter = new PrefixFilter(Bytes.toBytes("TABLENAME"));
scan.setFilter(prefixFilter);
ResultScanner rs = table.getScanner(scan);
int count = 0;
for(Result r: rs) {
Cell[] cells = r.rawCells();
for(Cell c: cells) {
// 可以先确认rowkey是否正确再执行删除 Delete dd = new Delete(CellUtil.cloneRow(c));
System.out.print("rowkey:" + Bytes.toString(CellUtil.cloneRow(c)) + "\n");
}
// 可以先确认rowkey是否正确再执行删除 table.delete(deletes);
count++;
}
System.out.println(count);
}
删除后停掉hmaster,然后删除hbase/MasterProcWALs/
目录下的日志文件,否则hbase仍然会出现RIT
# 查看文件目录
hdfs dfs -ls /apps/hbase/data/MasterProcWALs
# 删除文件
hdfs dfs -rm -r /apps/hbase/data/MasterProcWALs/*.log
完成这些操作后,重启HBase,RIT恢复。
该方法仅限临时规避。如果不解决还会出现问题,参考根因分析章节。另外因为当RIT发生的时候,是执行不了 balance 的,所以永久RIT的状况要及时解决。 ↩︎
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)