暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

HBase1.x实战:强制删除drop不掉的表(已生产实践)

大数据开发运维架构 2020-02-05
774

    生产上运维HBase的过程中经常遇到drop表失败的情况,一般我们通过删除hdfs存储目录、zookeeper数据的的方式进行强制删除。

大体步骤如下:

    这里以表“testTable12”为例

  1. 删除testTable12表在HDFS上的所有数据

    [hbase@master98 ~]$ hadoop  fs -rm -r -f  apps/hbase/data/data/default/testTable12
    20/02/04 17:34:38 INFO fs.TrashPolicyDefault: Moved: 'hdfs://mycluster/apps/hbase/data/data/default/testTable12' to trash at: hdfs://mycluster/user/hbase/.Trash/Current/apps/hbase/data/data/default/testTable12

      确认/apps/hbase/.tmp/data/default目录下是否有testTable12的数据,如果有也一并且删除,没有可忽略;

      [hbase@master98 ~]$ hadoop fs -rm  -r -f  /apps/hbase/data/.tmp/data/default/testTable12

      2.登录zookeeper的客户端查看hbase在zookeeper上的数据,尤其是region-in-transition和table-lock中是否有testTable12相关的数据,如果有直接删除,没有则忽略:

        [zk: 10.124.165.158:2181(CONNECTED) 4] ls hbase-unsecure/region-in-transition
        []
        [zk: 10.124.165.158:2181(CONNECTED) 5] ls hbase-unsecure/table-lock

        3.登录hbase shell删除testTable12在.meta表中的元数据信息:

          hbase(main):002:0> scan 'hbase:meta', {ROWPREFIXFILTER => 'testTable12'}

          通过deleteall删除整行命令,删除上一步扫描出来的所有记录,

            deleteall 'hbase:meta','testTable12,,1573363728768.19b4a1331cffa0555ea1f03fc63c18fc.'
            deleteall 'hbase:meta','testTable12,10,1573363728768.c0a8d7ae0a33cf7edd1f634611d5edcd.'
            deleteall 'hbase:meta',' '
            deleteall 'hbase:meta','testTable12,20,1573363728768.52d385969536ddc58b74b9c9fe28505a.'
            deleteall 'hbase:meta',' '
            deleteall 'hbase:meta','testTable12,30,1573363728768.927ef932d5bb065c304157e3cdbe39ad.'
            deleteall 'hbase:meta',' '
            deleteall 'hbase:meta','testTable12,40,1573363728768.4bc225057bb6a8751b3f82f889bc3dd3.'

            4.如果表是通过phoenixSQL创建,则需要登录phoenix客户端中删除表信息

            ,如不是通过phoenix建表,则忽略这一步。

            登录方式:

              [hbase@master98 ~]$ usr/hdp/2.6.3.0-235/phoenix/bin/sqlline.py

                  删除表:

                0: jdbc:phoenix:> drop table testTable12;

                    从SYSTEM.CATALOG系统表删除phoenix元数据:

                  DELETE from SYSTEM.CATALOG where TABLE_NAME ='mapped_table_name'

                  至此表强制删除表成功。

                  5.表删除后,检查HBase集群状态:

                    hbase hbck

                    如果有报错信息,可通过以下方式处理:

                    报错处理:

                        修复过程中可能会报错,可根据报错信息,去执行常用的hbase修复命令:

                      #上面的图发现region有空的row,所以我们需要进行修复一下:
                      [hbase@master98 ~]$ hbase hbck -fixEmptyMetaCells

                      常用HBase表修复命令,根据报错信息执行相应命令即可:

                        1. 检查输出所以ERROR信息,每个ERROR都会说明错误信息。
                        hbase hbck
                        2. 先修复tableinfo缺失问题,根据内存cache或者hdfs table 目录结构,重新生成tableinfo文件。
                        hbase hbck -fixTableOrphans
                        3. 修复regioninfo缺失问题,根据region目录下的hfile重新生成regioninfo文件
                        hbase hbck -fixHdfsOrphans
                        4. 修复region重叠问题,merge重叠的region为一个region目录,并从新生成一个regioninfo
                        hbase hbck -fixHdfsOverlaps
                        5. 修复region缺失,利用缺失的rowkey范围边界,生成新的region目录以及regioninfo填补这个空洞。
                        hbase hbck -fixHdfsHoles
                        6.修复meta表信息,利用regioninfo信息,重新生成对应meta row填写到meta表中,并为其填写默认的分配regionserver
                        hbase hbck -fixMeta
                        7. 把这些offline的region触发上线,当region开始重新open 上线的时候,会被重新分配到真实的RegionServer上 , 并更新meta表上对应的行信息。
                        hbase hbck -fixAssignments

                            如果最后实在修复不成功,再次执行完以上5步之后(这里第二步删除zookeeper中znode数据时,可直接清理根znode:执行rmr hbase-unsecure,因为HBase重启时会重新生成,不重启不要全部删除),重启集群,则删除zookeeper中znode所有数据。

                          [zk: 10.124.165.158:2181(CONNECTED) 4] rmr   /hbase-unsecure



                          放大招


                          另外HBase提供了一种离线修复方式,可执行以上5步之后,停止HBase集群,执行以下离线修复命令,重建元数据,执行完成后,启动HBase集群即可。

                          离线OfflineMetaRepair重建

                          > hbase org.apache.hadoop.hbase.util.hbck.OfflineMetaRepair -fix



                              经过以上步骤后,一般都可把集群修复成功。如有问题可公众号给我留言,谢谢!!!

                          文章转载自大数据开发运维架构,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                          评论