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

时间:2014-02-28 15:07:42

标签: java hadoop hbase cloudera

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

在HDFS中,一些块丢失了(hbase块)。所以它处于安全模式。我给了safemode -leave命令。

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

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

  1. 我多次执行“ 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.

  2. hbase hbck -fixMeta -fixAssignments HBaseFsckRepair:区域仍在转换中,等待它被分配:

    {NAME => 'test,1m\x00\x03\x1B\x15,1393439284371.4c213a47bba83c47075f21fec7c6d862.', STARTKEY => '1m\x00\x03\x1B\x15', ENDKEY => '', ENCODED => 4c213a47bba83c47075f21fec7c6d862,}

  3. hbase hbck -repair HBaseFsckRepair:区域仍在转换中,等待它被分配:

    {NAME => 'test,1m\x00\x03\x1B\x15,1393439284371.4c213a47bba83c47075f21fec7c6d862.', STARTKEY => '1m\x00\x03\x1B\x15', ENDKEY => '', ENCODED => 4c213a47bba83c47075f21fec7c6d862,}

  4. 我并行检查了 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

  5. 选中 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)
    
  6. 但是,我可以从HDFS浏览和下载文件。如何恢复数据?

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

3 个答案:

答案 0 :(得分:1)

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

  1. 验证您是否在安全群集上。您位于安全集群上,不是吗? ;)

    kinit [keytab] [principal]
    
  2. 运行HBase检查以查看具体未分配的区域

    hbase hbck -details
    
  3. 如果您看到这样的错误:

    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。

  4. 打开一个hbase shell

    hbase shell
    
  5. 通过将编码的区域名称传递给assign方法来分配区域。如帮助文档中所述,在没有先前的尽职调查的情况下,不应调用此命令,因为此命令将强制重新分配。文档说,我警告:仅适用于专家

    hbase(main):001:0> assign 'abcdef123456789abcdef12345678912'
    
  6. 通过对包含未分配区域的表运行hbase check,再次检查您的工作。

    hbase hbck my.tablename 
    

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

    0 inconsistencies detected.
    Status: OK
    

答案 1 :(得分:0)

Hbase 2.0.2版本中,没有修复选项可以恢复不一致。

  1. 运行hbase hbck命令。
  2. 如果错误消息如下所示:
ERROR: Region { meta => EMP_NMAE,\x02\x00\x00\x00\x00,1571419090798.054b393c37a80563ae1aa60f29e3e4df., hdfs => hdfs://node1:8020/apps/hbase/data/data/LEVEL_RESULT/054b393c37a80563ae1aa60f29e3e4df, deployed => , replicaId => 0 } not deployed on any region server.
ERROR: Region { meta => TABLE_3,\x02174\x0011100383\x00496\x001,1571324271429.6959c7157693956825be65676ced605c., hdfs => hdfs://node1:8020/apps/hbase/data/data/TABLE_NAME/6959c7157693956825be65676ced605c, deployed => , replicaId => 0 } not deployed on any region server.
  1. 将此错误不一致之处复制到文件中,并使用以下命令提取字母数字值。

如果我们的不一致计数较少,则我们可以手动获取值;如果数目较多,则可以检索整个值。因此,请使用以下命令将范围缩小到仅字母数字,然后可以将其复制并放到hbase shell中。

cat inconsistant.out|awk -F'.' '{print $2}'
  1. 打开hbase hbase shell并手动分配这些一致性。如下所示:
assign '054b393c37a80563ae1aa60f29e3e4df'
assign '6959c7157693956825be65676ced605c'
assign '7058dfe0da0699865a5b63be9d3799ab'
assign 'd25529539bae49eb078c7d0ca6ce84e4'
assign 'e4ad94f58e310a771a0f5a1eade884cc'

分配完成后,再次运行hbase hbck命令

答案 2 :(得分:0)

我有同样的问题。原来有地区重叠。我如何解决:

  1. 尝试分配未部署在hbase shell中的区域:分配“ Abcd ...”
  2. 检查HBase主日志中的ERROR AssingmentManager [类似内容:尝试分配区域{ENCODED => Abcd ...,NAME => ...,ts = 1591351130943, server = server1, 6020,1581641930622}]
  3. 关闭server1上的区域服务器
  4. 运行hbase hbck-修复my_table
  5. 对每个未部署地区重复一次

或者您可以仅重新启动hbase并运行'hbase hbck -repair'