HBase--强制删除表

  HBase 强制删除表,这个网上记录的也有,但是发现有些记录的有问题,如果要是在生产环境中就需要谨慎的去操作了。在这里我记录一下自己工作中遇到的这个问题,以及解决步骤,遇到类似问题可以参考一下。

发现异常信息

  • 发现表无法操作了,查看一下状态:
    1
    2
    3
    4
    5
    6
    7
    8
    hbase(main):003:0> desc 'HBaseTable'
    Table HBaseTable is DISABLED
    HBaseTable
    COLUMN FAMILIES DESCRIPTION
    {NAME => 'd', DATA_BLOCK_ENCODING => 'NONE', BLOOMFILTER => 'ROW', REPLICATION_SCOPE => '0',
    VERSIONS => '3', COMPRESSION => 'SNAPPY', MIN_VERSIONS => '0', TTL => 'FOREVER',
    KEEP_DELETED_CELLS => 'FALSE', BLOCKSIZE => '65536',IN_MEMORY=>'false',BLOCKCACHE=>'true'}
    1 row(s) in 0.0900 seconds
  • 表状态为DISABLED,那就enable 该表:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    hbase(main):004:0> enable 'HBaseTable' ##如下异常:
    ERROR: org.apache.hadoop.hbase.TableNotDisabledException: HBaseTable
    at org.apache.hadoop.hbase.master.handler.EnableTableHandler.prepare(EnableTableHandler.java:121)
    at org.apache.hadoop.hbase.master.HMaster.enableTable(HMaster.java:1654)
    at org.apache.hadoop.hbase.master.MasterRpcServices.enableTable(MasterRpcServices.java:572)
    at org.apache.hadoop.hbase.protobuf.generated.MasterProtos$MasterService$2.callBlockingMethod(MasterProtos.java:44233)
    at org.apache.hadoop.hbase.ipc.RpcServer.call(RpcServer.java:2034)
    at org.apache.hadoop.hbase.ipc.CallRunner.run(CallRunner.java:107)
    at org.apache.hadoop.hbase.ipc.RpcExecutor.consumerLoop(RpcExecutor.java:130)
    at org.apache.hadoop.hbase.ipc.RpcExecutor$1.run(RpcExecutor.java:107)
    at java.lang.Thread.run(Thread.java:745)

    Here is some help for this command:
    Start enable of named table:
    hbase> enable 't1'
    hbase> enable 'ns1:t1'
  • 通过desc查看描述信息,发现表的状态为DISABLED,然后enable该表,无效~! 当时有点蒙逼!

分析

  1. 发现该表enabledisabledrop都无效,也无法删除
  2. 检查表 region 信息,hbase hbck TableNotDisabledException 有错误信息.可能就是因为之前导入数据的时候该表有一个建立二级索引的协处理器,但是没有该表的二级索引表,异常导致HBase挂掉了,再次导入数据后导致region信息不一致了

    1
    2
    2016-11-08 02:34:02,645 ERROR org.apache.hadoop.hbase.client.AsyncProcess: Failed to get region location
    org.apache.hadoop.hbase.TableNotFoundException: HBaseTableIdx
  3. 参考 http://stackoverflow.com/questions/14557742/table-is-neither-enables-nor-disabled-in-hbase,通过hbase hbck -fixMeta -fixAssignments.无法修复!

解决

  • 强制删除表
  1. 删除zk中的数据,[zk: localhost:2181(CONNECTED) 2] rmr /hbase/table/HBaseTable
  2. 删除HDFS上的数据,hadoop fs -rmr /hbase/data/default/HBaseTable
  3. 删除meta表信息,在meta表查询(下面是HBase 版本1.0.0,meta表在hbase库中,注意一下HBase版本,找到自己的meta表就行)
    scan ‘hbase:meta’,{STARTROW=>’HBaseTable000’,ENDROW=>’HBaseTable~~~’,COLUMN=>’info:server’}
    如查询到信息如下:
    HBaseTable,,1478497826515.a004067142d51f88a067528bca69a6ec. column=info:server, timestamp=1478518834995, value=xxo:60020
    ….
    通过rowkey删除,记得删除把该表的meta数据删除干净(server,serverstartcode,regioninfo,seqnumDuringOpen)
    delete ‘hbase:meta’,’HBaseTable,,1478497826515.a004067142d51f88a067528bca69a6ec.’,’info:server’
    delete ‘hbase:meta’,’HBaseTable,,1478497826515.a004067142d51f88a067528bca69a6ec.’,’info:serverstartcode’
    delete ‘hbase:meta’,’HBaseTable,,1478497826515.a004067142d51f88a067528bca69a6ec.’,’info:regioninfo’
    delete ‘hbase:meta’,’HBaseTable,,1478497826515.a004067142d51f88a067528bca69a6ec.’,’info:seqnumDuringOpen’
  • 这时候去hbase中查看,发现还有该表,但是对该HBase表操作提示没有表信息了,这时候重启regionserver就解决问题了,如果是正式环境就不要重启了,直接创建一下该表就能正常使用了
    1
    2
    3
    4
    hbase(main):093:0> list
    HBaseTable
    hbase(main):094:0> desc 'HBaseTable'
    ERROR: Unknown table HBaseTable!

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器