Hbase集群恢复
问题
HMaster启动报错,查看日志,发现有类似错误,猜测hbase的元数据损坏导致
2020-11-19 13:30:21,578 WARN [master/td-ubuntu:16000:becomeActiveMaster] master.HMaster: hbase:namespace,,1597675221785.30d68ed750aa095b5172c0dd1bfe322a. is NOT online; state={30d68ed750aa095b5172c0dd1bfe322a state=OPEN, ts=1605763821379, server=td-ubuntu,16020,1605615663447}; ServerCrashProcedures=true. Master startup cannot progress, in holding-pattern until region onlined.
方案:
停止hbase相关进程,执行
${HBASE_ROOT}/bin/stop-hbase.sh
备份hbase中原始数据(以Hbase单机部署为例)
cp -r ${hbase.rootdir}/data/data/default ~/default_bak
注意:这里只备份了default namespace,如果存在其他namespace,需要一并备份
清空zookeeper中hbase元数据,登录zookeeper,执行rmr /hbase
[zk: localhost:2181(CONNECTED) 0] ls /
[cluster, brokers, zookeeper, admin, isr_change_notification, log_dir_event_notification, controller_epoch, device-job, consumers, latest_producer_id_block, config, hbase]
[zk: localhost:2181(CONNECTED) 1] rmr /hbase
清空hbase数据目录
rm -rf ${hbase.rootdir}/data/*
启动hbase
${HBASE_ROOT}/bin/start-hbase.sh
至此,初始化了一个空的hbase
再次关闭hbase,执行
${HBASE_ROOT}/bin/stop-hbase.sh
将备份的数据拷贝到空hbase的数据目录下
cp -r ~/default_bak/* ${hbase.rootdir}/data/data/default
将WALs日志拷贝到空hbase的WALs目录下(如再启动后提示WALs相关错误,此步骤可以忽略,但可能会丢失部分数据)
cp -r ~/default_bak/WALs/YOUR_HOSTNAME,160020,YOUR_STARTCODE/* ${hbase.rootdir}/data/WALs/YOUR_HOSTNAME,160020,YOUR_STARTCODE/
再次启动hbase
${HBASE_ROOT}/bin/start-hbase.sh
下载 HBase Operator Tools,解压得到hbase-hbck2-x.y.z.jar
执行region信息修复(以opentsdb表为例)
${HBASE_ROOT}/bin/hbase hbck -j ./hbase-hbck2-1.0.0.jar addFsRegionsMissingInMeta default:tsdb
${HBASE_ROOT}/bin/hbase hbck -j ./hbase-hbck2-1.0.0.jar addFsRegionsMissingInMeta default:tsdb-meta
${HBASE_ROOT}/bin/hbase hbck -j ./hbase-hbck2-1.0.0.jar addFsRegionsMissingInMeta default:tsdb-tree
${HBASE_ROOT}/bin/hbase hbck -j ./hbase-hbck2-1.0.0.jar addFsRegionsMissingInMeta default:tsdb-uid
再次重启hbase,并在hbase shell中对以上表执行disable && enable操作