Hbase表中的不一致[区域未部署在任何区域服务器上]

2020年11月29日 93点热度 0条评论

在小型HBase群集中,所有从节点都重新启动。当我启动HBase服务时,其中一个表(测试)变成不一致

在HDFS中,缺少某些块(hbase块)。因此它处于安全模式。我给了safemode -leave命令。

然后HBase表(测试)变得不一致。

我执行了以下提到的操作:

  • 我执行了几次“ hbase hbck ”。发现表“test”的不一致之处2。
    ERROR: Region { meta=>test,1m\x00\x03\x1B\x15,1393439284371.4c213a47bba83c47075f21fec7c6d862., hdfs => hdfs://master:9000/hbase/test/4c213a47bba83c47075f21fec7c6d862, deployed => } not deployed on any region server.
  • hbase hbck -fixMeta -fixAssignments HBaseFsckRepair:区域仍在过渡中,等待其被分配:
    {NAME => 'test,1m\x00\x03\x1B\x15,1393439284371.4c213a47bba83c47075f21fec7c6d862.', STARTKEY => '1m\x00\x03\x1B\x15', ENDKEY => '', ENCODED => 4c213a47bba83c47075f21fec7c6d862,}
  • hbase hbck -repair HBaseFsckRepair:区域仍在过渡中,等待其被分配:
    {NAME => 'test,1m\x00\x03\x1B\x15,1393439284371.4c213a47bba83c47075f21fec7c6d862.', STARTKEY => '1m\x00\x03\x1B\x15', ENDKEY => '', ENCODED => 4c213a47bba83c47075f21fec7c6d862,}
  • 我并行检查了 datanode日志

    日志:
    org.apache.hadoop.hdfs.server.datanode.DataNode: opReadBlock BP-1015188871-192.168.1.11-1391187113543:blk_7616957984716737802_27846 received exception java.io.EOFException WARN org.apache.hadoop.hdfs.server.datanode.DataNode: DatanodeRegistration(192.168.1.12, storageID=DS-831971799-192.168.1.12-50010-1391193910800, infoPort=50075, ipcPort=50020, storageInfo=lv=-40;cid=CID-7f99a9de-258c-493c-9db0-46b9e84b4c12;nsid=1286773982;c=0):Got exception while serving BP-1015188871-192.168.1.11-1391187113543:blk_7616957984716737802_27846 to /192.168.1.12:36127

  • 已检查 Namenode日志
    ERROR org.apache.hadoop.security.UserGroupInformation: PriviledgedActionException as:ubuntu (auth:SIMPLE) cause:java.io.FileNotFoundException: File does not exist: /hbase/test/4c213a47bba83c47075f21fec7c6d862/C 2014-02-28 14:13:15,738 
    INFO org.apache.hadoop.ipc.Server: IPC Server handler 6 on 9000, call org.apache.hadoop.hdfs.protocol.ClientProtocol.getBlockLocations from
    10.10.242.31:42149: error: java.io.FileNotFoundException: File does not exist: /hbase/test/4c213a47bba83c47075f21fec7c6d862/C java.io.FileNotFoundException: File does not exist: /hbase/test/4c213a47bba83c47075f21fec7c6d862/C at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getBlockLocationsUpdateTimes(FSNamesystem.java:1301)
    
  • 但是,我能够从HDFS浏览和下载文件。如何恢复数据?

    如何使“测试”表保持一致?

    解决方案如下:

    在HBase 2.0(可能还有以前的版本)中,通常通过获取分配的区域来解决“未部署在任何区域服务器上”的问题。

  • 如果您位于安全集群上,请进行身份验证。您位于安全集群上,不是吗? ;)
    kinit [keytab] [principal]
    
  • 运行HBase检查以查看具体未分配的区域
    hbase hbck -details
    
  • 如果看到这样的错误:
    ERROR: Region { 
        meta => my.tablename,,1500001112222.abcdef123456789abcdef12345678912., 
        hdfs => hdfs://cluster/apps/hbase/data/data/default/my.tablename/abcdef123456789abcdef12345678912,
        deployed => ,
        replicaId => 0 
    } not deployed on any region server.
    

    (密钥为“未部署在任何区域服务器上”),则应分配区域。事实证明,这非常简单。继续执行步骤4。

  • 打开一个hbase shell
    hbase shell
    
  • 通过将编码的regionname传递给Assign方法来分配区域。如帮助文档中所述,如果没有先前的尽职调查,则不应调用此命令,因为此命令将强制重新分配。文档说,我警告:仅适用于专家。
    hbase(main):001:0> assign 'abcdef123456789abcdef12345678912'
    
  • 通过运行hbase check对具有未分配区域的表进行双重检查。
    hbase hbck my.tablename 
    

    如果您正确执行了所有操作,并且没有潜在的HDFS问题,那么应该在hbck输出的底部附近看到以下消息:

    0 inconsistencies detected.
    Status: OK