生产上运维HBase的过程中经常遇到drop表失败的情况,一般我们通过删除hdfs存储目录、zookeeper数据的的方式进行强制删除。
大体步骤如下:
这里以表“testTable12”为例
删除testTable12表在HDFS上的所有数据
[hbase@master98 ~]$ hadoop fs -rm -r -f apps/hbase/data/data/default/testTable1220/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 hbck2. 先修复tableinfo缺失问题,根据内存cache或者hdfs table 目录结构,重新生成tableinfo文件。hbase hbck -fixTableOrphans3. 修复regioninfo缺失问题,根据region目录下的hfile重新生成regioninfo文件hbase hbck -fixHdfsOrphans4. 修复region重叠问题,merge重叠的region为一个region目录,并从新生成一个regioninfohbase hbck -fixHdfsOverlaps5. 修复region缺失,利用缺失的rowkey范围边界,生成新的region目录以及regioninfo填补这个空洞。hbase hbck -fixHdfsHoles6.修复meta表信息,利用regioninfo信息,重新生成对应meta row填写到meta表中,并为其填写默认的分配regionserverhbase hbck -fixMeta7. 把这些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
经过以上步骤后,一般都可把集群修复成功。如有问题可公众号给我留言,谢谢!!!




