Hbase2.0版本不支持Hbck修复命令,无法尝试修复

    对的HBASE集群做跨集群数据表的迁移过程中出现了HBASE集群管理界面出现了如下情况如下图所示

   

hbase 查看region最大 hbase查看region状态_hbase 查看region最大

问题排查

    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 的方法如下:

                           

hbase 查看region最大 hbase查看region状态_大数据_02

              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.'

停止HBASE集群备份数据

备份namespace表数据:hdfs dfs -cp /apps/hbase/data/data/hbase/namespace  /备份目录

备份MasterProcWALs目录数据   hdfs dfs -cp /apps/hbase/data/MasterProcWALs  /备份目录

清理数据【namespace,MasterProcWALs】

清理namespace表 : hdfs dfs -rm -r /apps/hbase/data/data/hbase/namespace

清理MasterProcWALs文件:hdfs dfs -rm -r /apps/hbase/data/MasterProcWALs

                   4.9.3 重启HBASE集群观察namespace表是否重新创建,region是否已经分配的regionserver,观察master是否已经启动。

                   4.9.4 此时master已经重新启动,并且在通过hbase shell 命令可以查看到所有的hbase表,以及通过hbase的web控制台可以看到之前已经创建的表。

                   4.9.5 此时恢复namespace当中的数据,由于我们只有的namespace中只有少量的记录,因此通过重新创建namespace的数据具体操作如下

                        1.登陆hbase shell

                        2. create_namespace 'Namespace'

                   4.9.6 到此时验证数据表应该能够正常访问了把,测试一张离线有数据的小表如下所示

                             1.登陆hbase shell

                             2.scan 'Namespace:tables'

                             此时发现表中没有查到数据,但是在集群崩溃前确认是有数据的【崩溃中】,继续如下操作确认表的状态

                             在HBASE SHELL中执行如下命令

                                 is_enabled 'Namespace:tables'   但是显示表的状态为enable,怎么办难道真的要重新让数仓同学重新导入数据吗?继续测试,

                             在HBASE SHELL中执行如下命令

                                 禁用表:disable "Namespace:tables" ,

                                 启用表:enable "Namespace:tables"

                              然后验证数据是否正常,在HBASE SHELL当中执行

                                  scan "Namespace:tables"

                              此时发现表已经能够查询到数据了,并且通过phoenix客户端也验证了数据,后续将集群中的所有表进行一次disable,enable操作至此集群所有表恢复正常。