Hbase2.0版本不支持Hbck修复命令,无法尝试修复
对的HBASE集群做跨集群数据表的迁移过程中出现了HBASE集群管理界面出现了如下情况如下图所示
问题排查
1. 排查上图中有问题的region对应的HDFS文件是否还存在。(排查结果当前不存在了)
2. 排查当前对集群的操作当前只对集群多了通过快照的方式对集群进行数据恢复操作,后排查SHELL脚本发现在数据恢复的脚本有清理 /apps/hbase/data/archive次目录下的文件
然而此目录为HBASE集群(存储表的归档和快照,HBase 在做 Split或者 compact 操作完成之后,会将 HFile 移到archive 目录中,然后将之前的 hfile 删除掉,该目录由 HMaster 上的
一个定时任务定期去清理)然而,当时脚本中有清理掉此目录下的所有文件。导致部分表的hdfs 文件丢失。
解决方案
1. 尝试重启HBASE集群看看是不是还会有其他问题。【Master不能启动】
1.1 重启集群后HBASE的master日志一直提示Meta表当中关联的region处于RIT当中。
1.2 重启集群后HBASE的master日志一直提示等待Meta表上线,部分有问题的region不能上线。
2. 网上查询了使用hbck修复,可是当前版本(2.0.2.3版本)当前工具不支持。
3. 一通搜索下来没有找到可用的方案,此时查看有问题的HBASE的region对应的HDFS文件已经不存在,想要恢复这些有问题的预发表就比较困难。
4. 开始尝试恢复
4.1. 强行删掉Meta表中有问题的region信息(此时可能存在如下问题Meta表的RowKey存在不可见字符,有可能需要写代码删除)
scan 'hbase:meta',{FILTER => org.apache.hadoop.hbase.filter.PrefixFilter.new(org.apache.hadoop.hbase.util.Bytes.toBytes('Namespace:tables'))}
get 'hbase:meta','Namespace:tables'
deleteall 'hbase:meta','Namespace:tables'
4.2 删掉所有问题的预发表对应的HDFS文件
4.3 停掉HBASE服务
4.4 备份目录下的文件/apps/hbase/data/MasterProcWALs,然后清理掉此目录下的文件(如果重新启动HBASE还是会加载这个目录下的日志数据)
4.5 重启HBASE集群(master服务仍然不能启动)继续崩溃中。。。。。
4.6 删除HBASE在ZK下的存储目录让其根据集群配置,进行ZK元数据的重建
登陆ZK安装服务器
进入安装目录执行 cd /usr/hdp/3.1.4.0-315/zookeeper/bin
执行 如下语句
sh zkCli.sh
rmr /hbase-unsecure
4.7 重启Hbase集群后提示,master日志提示namespace表不能上线,等待namespace表上线后HBASE的Master服务才能启动。
4.8 网上的方法都不好用,那么只能查看HBASE源码,此时发现源码中关于namespace表的初始化代码(首先会检查namespace表是否存在,如果不存在会重新创建)。
具体涉及源码类:org.apache.hadoop.hbase.master.TableNamespaceManager 的方法如下:
4.9 到此时死马当活马医,停掉HBASE集群,备份HBASE的namespace的数据,删除namespace让其重建namespace的表执行如下命令
4.9.1 登陆到master服务器
su - hbase
4.9.2 清理HBASE元数据表中关于namespace的记录
scan 'hbase:meta',{FILTER => org.apache.hadoop.hbase.filter.PrefixFilter.new(org.apache.hadoop.hbase.util.Bytes.toBytes('hbase:namespace'))}
找出图中关于namespace的rowkey将其删掉执行如下语句
deleteall 'hbase:meta','hbase:namespace'
deleteall 'hbase:meta',hbase:namespace,,1581765383054.0441572cbb5c13996d591084f7953e20.'