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

Pau*_*aul 4 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)
    
    Run Code Online (Sandbox Code Playgroud)

但是,我可以从 HDFS 浏览和下载文件。如何恢复数据?

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

Wat*_*Box 7

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

  1. 如果您在安全集群上,请进行身份验证。你在一个安全的集群上,不是吗?;)

    kinit [keytab] [principal]
    
    Run Code Online (Sandbox Code Playgroud)
  2. 运行 HBase 检查以查看哪些区域未分配

    hbase hbck -details
    
    Run Code Online (Sandbox Code Playgroud)
  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.
    
    Run Code Online (Sandbox Code Playgroud)

    (关键是“未部署在任何区域服务器上”),那么您应该分配区域。事实证明,这非常简单。继续执行步骤 4。

  4. 打开一个 hbase shell

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

    hbase(main):001:0> assign 'abcdef123456789abcdef12345678912'
    
    Run Code Online (Sandbox Code Playgroud)
  6. 通过对具有未分配区域的表运行 hbase check 来仔细检查您的工作。

    hbase hbck my.tablename 
    
    Run Code Online (Sandbox Code Playgroud)

    如果你做的一切都正确并且没有潜在的 HDFS 问题,你应该在 hbck 输出的底部附近看到这条消息:

    0 inconsistencies detected.
    Status: OK
    
    Run Code Online (Sandbox Code Playgroud)