在一个小型HBase集群中,所有从属节点都重新启动。当我启动HBase服务时,其中一个表(测试)变得不一致。
在HDFS中,缺少一些块(hbase块)。所以它处于安全模式。我发出了safemode -leave
命令。
然后HBase表(测试)变得不一致。
我执行了以下操作:
-
我执行了几次">hbase hbck"。表"测试"中发现2处不一致。
ERROR: Region { meta=>test,1mx00x03x1Bx15,1393439284371.4c213a47bba83c47075f21fec7c6d862., hdfs => hdfs://master:9000/hbase/test/4c213a47bba83c47075f21fec7c6d862, deployed => } not deployed on any region server.
-
hbase hbck-fixMeta-fixAssignmentsHBaseFsckRepair:区域仍在转换中,等待分配:
{NAME => 'test,1mx00x03x1Bx15,1393439284371.4c213a47bba83c47075f21fec7c6d862.', STARTKEY => '1mx00x03x1Bx15', ENDKEY => '', ENCODED => 4c213a47bba83c47075f21fec7c6d862,}
-
hbase hbck-修复HBaseFsckRepair:区域仍在过渡中,等待分配:
{NAME => 'test,1mx00x03x1Bx15,1393439284371.4c213a47bba83c47075f21fec7c6d862.', STARTKEY => '1mx00x03x1Bx15', ENDKEY => '', ENCODED => 4c213a47bba83c47075f21fec7c6d862,}
-
我并行检查了数据节点日志。
日志:
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
-
已检查名称节点日志
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外壳
hbase shell
-
通过将编码的regionname传递给Assign方法来分配区域。如帮助文档中所述,在没有之前的尽职调查的情况下,不应调用此命令,因为此命令将执行强制重新分配。医生们说,我提醒大家:仅供专家使用。
hbase(main):001:0> assign 'abcdef123456789abcdef12345678912'
-
通过对具有未分配区域的表运行hbase检查来仔细检查您的工作。
hbase hbck my.tablename
如果你做的每件事都正确,并且没有潜在的HDFS问题,你应该在hbck输出的底部附近看到这个消息:
0 inconsistencies detected. Status: OK
在Hbase 2.0.2
版本中,没有修复选项来恢复不一致。
- 运行hbase-hback命令
- 如果错误台面如下所述:
ERROR: Region { meta => EMP_NMAE,x02x00x00x00x00,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,x02174x0011100383x00496x001,1571324271429.6959c7157693956825be65676ced605c., hdfs => hdfs://node1:8020/apps/hbase/data/data/TABLE_NAME/6959c7157693956825be65676ced605c, deployed => , replicaId => 0 } not deployed on any region server.
- 将此错误不一致性复制到文件中,并使用以下命令提取字母数字值
如果我们的不一致计数较少,我们可以手动获取值,如果数字较多,则会忙于检索整个值。因此,使用下面的命令可以将范围缩小到单独的alphanemeric,它可以被复制并一段时间放在hbaseshell中。
cat inconsistant.out|awk -F'.' '{print $2}'
- 打开hbase hbase shell并手动分配这些一致性。如下所示:
assign '054b393c37a80563ae1aa60f29e3e4df'
assign '6959c7157693956825be65676ced605c'
assign '7058dfe0da0699865a5b63be9d3799ab'
assign 'd25529539bae49eb078c7d0ca6ce84e4'
assign 'e4ad94f58e310a771a0f5a1eade884cc'
分配完成后,再次运行hbase-hback命令
我也遇到了同样的问题。结果发现有区域重叠。我如何修复:
- 尝试分配未部署在hbase shell中的区域:assign"Abcd…">
- 检查HBase主日志中的ERROR AssingmentManager[类似的内容:正在尝试分配区域{ENCODED=>Abcd…,NAME=>…,ts=1593351130943,server=server160201581641930622}]
- 关闭服务器1上的区域服务器
- 运行hbase hbck-修复my_table
- 对每个未部署的区域重复
或者您可以重新启动hbase并运行"hbase-hback-repair">