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

临时规避

另创建一张表(不推荐)

根因分析

上次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恢复。

参考


  1. 该方法仅限临时规避。如果不解决还会出现问题,参考根因分析章节。另外因为当RIT发生的时候,是执行不了 balance 的,所以永久RIT的状况要及时解决。 ↩︎

posted @   LexLuc  阅读(2282)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
点击右上角即可分享
微信分享提示