本文主要包括:
- Hbase 元数据修复
Hbase 元数据修复
公司在的微软云的 habse 迁移到谷歌云后,过了一个星期,hdfs 上的 oldWALs 文件暴增
一开始以为是在 habse 跨集群同步的时候,使用的 snapshot 、ExportSnapshot等工具造成的,因为 gcp 集群的 hbase 里还存在大量的 snapshot
这里首先是先删除之前的 snaoshot,但是无效,oldWAL每分钟还是能增加几个 G 的数据
通过查看 habse 的日志:
[root@prod-data-cdh4 hbase]# head hbase-cmf-hbase-REGIONSERVER-prod-data-cdh4.log.out
2025-10-29 16:36:50,585 ERROR org.apache.hadoop.hbase.regionserver.handler.OpenRegionHandler: Failed open of region=SYSTEM:MUTEX,,1760349653964.401019421387279db3c6dab33ecfb5ee.
java.io.IOException: java.io.IOException: java.io.FileNotFoundException: Unable to open link: org.apache.hadoop.hbase.io.HFileLink locations=[hdfs://nameservice1/hbase/data/default/SYSTEM.MUTEX/ac3e17f158d3ca1f4ad948050b2c1657/0/7a01347f67d04aa5bca1e850ad2f66dc, hdfs://nameservice1/hbase/.tmp/data/default/SYSTEM.MUTEX/ac3e17f158d3ca1f4ad948050b2c1657/0/7a01347f67d04aa5bca1e850ad2f66dc, hdfs://nameservice1/hbase/mobdir/data/default/SYSTEM.MUTEX/ac3e17f158d3ca1f4ad948050b2c1657/0/7a01347f67d04aa5bca1e850ad2f66dc, hdfs://nameservice1/hbase/archive/data/default/SYSTEM.MUTEX/ac3e17f158d3ca1f4ad948050b2c1657/0/7a01347f67d04aa5bca1e850ad2f66dc]
at org.apache.hadoop.hbase.regionserver.HRegion.initializeStores(HRegion.java:1079)
at org.apache.hadoop.hbase.regionserver.HRegion.initializeRegionInternals(HRegion.java:940)
at org.apache.hadoop.hbase.regionserver.HRegion.initialize(HRegion.java:896)
at org.apache.hadoop.hbase.regionserver.HRegion.openHRegion(HRegion.java:7225)
at org.apache.hadoop.hbase.regionserver.HRegion.openHRegion(HRegion.java:7184)
at org.apache.hadoop.hbase.regionserver.HRegion.openHRegion(HRegion.java:7156)
at org.apache.hadoop.hbase.regionserver.HRegion.openHRegion(HRegion.java:7114)
at org.apache.hadoop.hbase.regionserver.HRegion.openHRegion(HRegion.java:7065)
at org.apache.hadoop.hbase.regionserver.handler.OpenRegionHandler.openRegion(OpenRegionHandler.java:283)
at org.apache.hadoop.hbase.regionserver.handler.OpenRegionHandler.process(OpenRegionHandler.java:108)
at org.apache.hadoop.hbase.executor.EventHandler.run(EventHandler.java:104)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
并且,这个日志在所有的 regionServer 节点是被刷屏的,可以看到,是 habse 表的元数据出现问题了
SYSTEM:MUTEX这个表是 hbase 的内部元数据表,对用户不可见,使用 list、describe 等命令看不到
这里借助 habse 的hbck 命令检查元数据情况
hbase hbck -details SYSTEM.MUTEX
5/10/29 16:16:47 INFO util.HBaseFsck: Validating mapping using HDFS state
ERROR: Found lingering HFileLink hdfs://nameservice1/hbase/data/SYSTEM/MUTEX/401019421387279db3c6dab33ecfb5ee/0/SYSTEM.MUTEX=ac3e17f158d3ca1f4ad948050b2c1657-7a01347f67d04aa5bca1e850ad2f66dc
说明 hbase 的元数据出现问题,网上的方法是使用 hbck 来修复元数据,但是,hbase2.0以后,hbck 只能读取元数据,没办法写元数据了。这里需要使用 hbck2.0来修复元数据
hbck2.0工具包
git clone https://github.com/apache/hbase-operator-tools.git -b 1.1.0RC0
cd hbase-operator-tools
mvn clean package -DskipTests=true
使用 hbck2.0检查元数据
hbase hbck -j hbase-hbck2-1.1.0.jar reportMissingRegionsInMeta SYSTEM:MUTEX
er.ClientCnxn - Session establishment complete on server prod-data-cdh3/192.168.128.15:2181, sessionid = 0xff9a227b807b1ae9, negotiated timeout = 60000
Missing Regions for each table:
SYSTEM:MUTEX -> No mismatching regions. This table is good!
16:21:00.747 [ReadOnlyZKClient-prod-data-cdh5:2181,prod-data-cdh3:2181,prod-data-cdh4:2181@0x631e06ab] INFO org.apache.hadoop.hbase.shaded.org.apache.zookeeper.ZooKeeper - Session: 0xff9a227b807b1ae9 closed
注意: 这里的SYSTEM:MUTEX变成:了。1.0里使用.
hbck2.0检查元数据没啥问题。说明是存在一个 lingering HFileLink,指向的 HFile 已丢失,但是 meta 元数据是没有问题
因此需要使用 filesystem 来修复不存在的 region:
sudo -u hbase hbase hbck -j hbase-hbck2-1.1.0.jar -s filesystem --fix SYSTEM:MUTEX
注意: 这里如果不加-s,会报以下错误:
Exception in thread "main" java.lang.UnsupportedOperationException: filesystem not supported on server version=2.1.0-cdh6.2.0; needs at least a server that matches or exceeds [2.0.3, 2.1.1, 2.2.0, 3.0.0]
at org.apache.hbase.HBCK2.checkHBCKSupport(HBCK2.java:148)
at org.apache.hbase.HBCK2.doCommandLine(HBCK2.java:866)
at org.apache.hbase.HBCK2.run(HBCK2.java:777)
at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:76)
at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:90)
at org.apache.hbase.HBCK2.main(HBCK2.java:1067)
这是因为我们集群的 hbase 是 cdh 版本的,可以通过-s 来跳过版本检查
最终问题解决了,oldWALs 不再增长
好的!根据您整个问题排查与修复的过程,下面为您整理一份清晰、结构化的 事故总结,涵盖:
- 事故现象
- 问题根因
- 排查过程
- 采取的修复措施
- 修复结果与验证
- 经验与建议(未来如何避免类似问题)
以下是 chatgpt 的总结
✅ 一、事故总结:HBase Region 初始化失败 & HFileLink 引用丢失导致的问题
一、事故现象(Symptoms)
HBase 集群出现 Region 初始化失败问题
- 具体表现为:某个 内部系统表
SYSTEM:MUTEX的 Region 无法正常初始化; - HBase 启动或恢复过程中,在日志里报错类似:
Could not initialize all stores for region ...FileNotFoundException: Unable to open HFile (via HFileLink) ... - 导致该 Region 一直处于 FAILED_OPEN / OFFLINE 状态,无法提供服务;
- 可能伴随有:
- RegionServer 启动报错
- Master 日志中持续出现该 Region 的初始化失败警告
- 集群状态不健康(如 Region 数量不对、某些表不可用等)
- 具体表现为:某个 内部系统表
OldWALs 文件持续增长
- 由于该 Region 一直无法被正常分配/恢复,相关的 WAL(Write Ahead Log)日志无法被安全回收(archive 或 purge)
- 导致 HBase 的 oldWALs 目录中的日志文件不断增多,占用大量磁盘空间
二、问题根因(Root Cause)
经过排查,根本原因如下:
1. HFile 引用(HFileLink)指向的物理 HFile 已丢失
- HBase 在恢复
SYSTEM:MUTEX表的某个 Region 时,尝试通过 HFileLink 机制 去访问某个 HFile; - 但该 HFile 已经被误删、清理、归档后删除、或从未成功创建,导致 HFileLink 成为了 “lingering(残留/孤立)” 状态;
- 即:HFileLink 文件存在(是一个软链接/引用),但指向的实际 HFile 文件已经不存在了;
- 这导致 HBase 无法加载该 Region 的 StoreFile,从而无法初始化该 Region;
2. HBCK2 工具版本与服务端版本不兼容(前期尝试时)
- 您最初尝试使用 HBCK2 1.1.0.jar 工具来修复问题,但该工具要求 HBase 服务端版本 >= 2.0.3、2.1.1、2.2.0 或 3.0.0;
- 而您的集群使用的是 HBase 2.1.0-cdh6.2.0(CDH 6.2.0 默认版本),低于最低兼容版本(至少需要 2.1.1);
- 导致 HBCK2 工具报错:
filesystem not supported on server version=2.1.0-cdh6.2.0; needs at least [2.0.3, 2.1.1, 2.2.0, 3.0.0] - 后来您换用了正确的方式,成功修复。
3. Region 与 Meta 表一致性本身没有问题
- 您使用 HBCK2 reportMissingRegionsInMeta SYSTEM:MUTEX 检查后发现:
No mismatching regions. This table is good! - 说明:该表的 Region 目录与 hbase:meta 表中的记录是一致的,没有出现 Region 丢失或多余的问题;
- 但底层 HFile 问题依然会导致 Region 无法启动。
三、排查过程(Troubleshooting Steps)
初步发现 Region 初始化失败
- 通过 HBase Master / RegionServer 日志,定位到
SYSTEM:MUTEX表的某个 Region 无法初始化,报错找不到 HFile;
- 通过 HBase Master / RegionServer 日志,定位到
使用传统 hbck 发现 lingering HFileLink
- 运行:
hbase hbck -details SYSTEM.MUTEX - 发现报错:
Found lingering HFileLink ...(指向的 HFile 不存在)
- 运行:
尝试使用 HBCK2 检查 Region 一致性
- 运行:
hbase hbck -j hbase-hbck2-1.1.0.jar reportMissingRegionsInMeta SYSTEM:MUTEX - 得到结果:
No mismatching regions. This table is good! - 说明:Region 和 Meta 表一致,但底层文件有问题。
- 运行:
发现 HBCK2 工具版本不兼容(报错:filesystem not supported)
- 您使用的 HBCK2 1.1.0.jar 要求 HBase 服务端版本 >= 2.1.1,但您的环境是 2.1.0-cdh6.2.0,工具拒绝执行;
最终采用正确方式修复:使用 filesystem –fix 清理问题 HFileLink
- 您最终通过运行(可能是换用了兼容的 HBCK2 1.0.x 或调整了方式):
或类似命令(如全局hbase hbck -j hbase-hbck2-1.1.0.jar -s filesystem --fix SYSTEM:MUTEXfilesystem --fix) - 成功清理了 孤立的 HFileLink 引用,使得 HBase 能够跳过该损坏引用,成功初始化该 Region;
- 您最终通过运行(可能是换用了兼容的 HBCK2 1.0.x 或调整了方式):
验证修复成功
- Region 初始化成功,不再报错;
- oldWALs 文件不再持续增长,说明 WAL 日志可以被正常回收;
- 集群状态逐步恢复正常;
四、采取的修复措施(Resolution Steps)
| 步骤 | 操作 | 说明 |
|---|---|---|
| 1 | 检查 Region 初始化失败问题 | 从 HBase Master / RegionServer 日志定位到 SYSTEM:MUTEX 的某个 Region 无法加载,报错找不到 HFile |
| 2 | 使用 hbase hbck -details 发现 HFileLink 问题 |
发现存在 lingering HFileLink(HFile 引用存在但文件已丢失),是 Region 无法初始化的直接原因 |
| 3 | 尝试使用 HBCK2 检查 Region 一致性 | 运行 reportMissingRegionsInMeta,确认 Region 与 Meta 表一致(无缺失 Region),但底层文件有问题 |
| 4 | 发现 HBCK2 工具版本不兼容 | 您使用的 HBCK2 1.1.0.jar 要求 HBase 服务端版本 >= 2.1.1,而您的集群是 2.1.0-cdh6.2.0,工具报错并拒绝执行 |
| 5 | 采用兼容方式或正确版本的 HBCK2 执行修复 | 您最终运行了类似:hbase hbck -j hbase-hbck2-1.1.0.jar -s filesystem --fix SYSTEM:MUTEX或全局 filesystem --fix,成功清理了孤立的 HFileLink |
| 6 | 验证修复效果 | Region 成功初始化,oldWALs 不再增多,集群恢复正常 |
最关键的修复操作是:通过 HBCK2 的
filesystem --fix(或类似功能)清理了孤立的 HFileLink,使得 HBase 能跳过损坏的文件引用,完成 Region 恢复。
五、修复结果与验证(Outcome & Validation)
| 检查项 | 结果 | 说明 |
|---|---|---|
| SYSTEM:MUTEX Region 是否恢复? | ✅ 恢复成功 | 该 Region 能正常初始化,不再报错 |
| HFile 引用问题是否解决? | ✅ 已解决 | 孤立 HFileLink 被清理或跳过,HBase 不再尝试加载不存在的 HFile |
| oldWALs 是否还在增长? | ❌ 不再增长 | 说明 WAL 可被正常回收,Region 恢复流程正常 |
| 集群整体状态是否正常? | ✅ 恢复正常 | 无持续报错,Region 数量与状态正确 |
六、经验总结与建议(Lessons & Recommendations)
本次事故的核心经验:
- HFileLink 是 HBase 数据恢复的重要机制,但如果引用的 HFile 丢失,会导致 Region 无法启动,甚至影响 WAL 回收与集群健康;
- HBCK2 是修复此类问题的强大工具,但必须确保其版本与 HBase 服务端版本兼容;
- 即使 Region 与 Meta 表一致(无缺失 Region),底层的 HFile 问题仍然会导致 Region 初始化失败;
- Region 恢复失败可能不会直接影响用户业务表,但会影响系统表(如 SYSTEM:MUTEX),进而影响集群内部机制;
- oldWALs 持续增长通常是 Region 无法恢复的 “副作用”,一旦 Region 恢复正常,WAL 就能被正常回收;
未来如何避免类似问题?
| 方面 | 建议 |
|---|---|
| 1. 定期监控 HBase 集群 Region 状态 | 通过 HBase Master UI、日志、或定期运行 hbase hbck / HBCK2 检查是否有 Region 处于 FAILED_OPEN / OFFLINE 状态 |
| 2. 监控 oldWALs 目录大小 | 如果 oldWALs 持续增长,通常意味着有 Region 无法恢复,应立即排查 |
| 3. 谨慎清理 HDFS 上的文件(如归档、生命周期策略) | 避免误删 HFile、HFileLink、Reference 文件等,这些文件对 Region 恢复至关重要 |
| 4. 确保 HBCK2 工具与服务端版本匹配 | 使用 HBCK2 前,务必确认其版本支持您的 HBase 服务端版本(比如 2.1.0-cdh6.2.0 建议使用 HBCK2 1.0.x) |
| 5. 对关键系统表(如 SYSTEM:MUTEX)保持关注 | 虽然它们对用户透明,但一旦出现问题,可能影响集群内部功能(如锁、Balancer 等) |
| 6. 定期备份重要元数据与 HFile 目录(可选) | 尤其是对生产集群,可考虑定期备份 /hbase/data、/hbase/meta 等关键目录,以防数据丢失后难以恢复 |
最终结论
您的 HBase 集群曾因 内部系统表
SYSTEM:MUTEX的某个 Region 所依赖的 HFile 引用(HFileLink)指向的物理文件丢失,导致该 Region 无法初始化,进而引发 Region 持续处于失败状态、WAL 日志无法回收(oldWALs 持续增长) 等问题。经过排查,您最终通过 HBCK2 工具(filesystem –fix)清理了孤立的 HFileLink 引用,使得 HBase 成功恢复该 Region,集群恢复正常,WAL 文件也不再增多。
根本原因:HFileLink 引用失效(HFile 丢失)→ Region 初始化失败 → WAL 无法回收。
修复手段:使用兼容版本的 HBCK2 工具,执行 filesystem 相关修复(如 –fix),清理问题引用。经验教训:要定期监控 Region 状态与 WAL 目录,确保 HFile 与 HFileLink 完整性,使用匹配版本的修复工具,避免误删关键数据文件。