hbase:meta区域未在线导致HBase Master无法初始化问题
问题现象
Master启动卡主,核心报错日志:
2024-08-06 04:28:48,632 WARN [master/groot:16000:becomeActiveMaster] master.HMaster: hbase:namespace,,1650003038679.d8ca96dfa7bc436291f544e78688d3bf. is NOT online; state={d8ca96dfa7bc436291f544e78688d3bf state=OPEN, ts=1722932865164, server=hulk.mcloud.com,60020,1722236433701}; ServerCrashProcedures=false. Master startup cannot progress, in holding-pattern until region onlined.
同时存在大量OPEN regions标记在未知服务器上,手动执行unassign/assign命令无效。
解决步骤
1. 强制终止所有HBase进程
先彻底关停HBase集群,避免残留进程干扰:
# 停止HBase服务 $HBASE_HOME/bin/stop-hbase.sh # 强制清理剩余HBase进程 jps | grep -E "HMaster|HRegionServer" | awk '{print $1}' | xargs kill -9
2. 清理ZooKeeper中的失效节点
连接ZooKeeper客户端,删除失效的RegionServer注册信息和region过渡状态:
# 进入ZooKeeper命令行 $ZOOKEEPER_HOME/bin/zkCli.sh
在ZooKeeper中执行以下操作:
# 删除失效的RegionServer节点 rmr /hbase/rs/hulk.mcloud.com,60020,1722236433701 # 删除hbase:namespace region的过渡状态节点(若存在) rmr /hbase/region-in-transition/d8ca96dfa7bc436291f544e78688d3bf
3. 修改HDFS上的region元数据
将hbase:namespace region的状态从OPEN改为CLOSED,让Master可以重新分配:
# 编辑region的info文件 hdfs dfs -cat /hbase/data/hbase/namespace/d8ca96dfa7bc436291f544e78688d3bf/info | sed 's/state=OPEN/state=CLOSED/' > temp_info # 覆盖原文件 hdfs dfs -put temp_info /hbase/data/hbase/namespace/d8ca96dfa7bc436291f544e78688d3bf/info # 清理临时文件 rm temp_info
4. 重启集群并重新分配region
启动HBase集群后,手动触发region分配:
# 启动HBase $HBASE_HOME/bin/start-hbase.sh # 进入HBase Shell $HBASE_HOME/bin/hbase shell # 重新分配hbase:namespace region unassign 'd8ca96dfa7bc436291f544e78688d3bf' assign 'd8ca96dfa7bc436291f544e78688d3bf' # 检查region状态 list_regions 'hbase:namespace'
5. 验证Master初始化状态
查看Master日志,确认是否完成启动并同步所有region:
tail -f $HBASE_HOME/logs/hbase-*-master-*.log
内容的提问来源于stack exchange,提问作者Omkar Kumbhar

