在一个小型hbase集群中,所有从属节点都重新启动。当我启动hbase服务时,其中一个表(test)变得不一致。
在hdfs中,某些块丢失(hbase块)。所以它处于安全模式。我给了 safemode -leave
命令。
然后hbase表(test)变得不一致。
我采取了以下行动:
我执行了好几次“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-fixmassignments hbasefsckrepair:区域仍在转换中,等待它被分配: {NAME => 'test,1m\x00\x03\x1B\x15,1393439284371.4c213a47bba83c47075f21fec7c6d862.', STARTKEY => '1m\x00\x03\x1B\x15', ENDKEY => '', ENCODED => 4c213a47bba83c47075f21fec7c6d862,}
hbase hbck-repair hbasefskrepair:区域仍在转换中,等待它被分配: {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浏览和下载文件。如何恢复数据?
如何使“test”表保持一致?
3条答案
按热度按时间k4emjkb11#
在
Hbase 2.0.2
版本没有修复选项来恢复不一致。运行hbase hbck命令。
如果错误消息如下所述:
将此错误不一致性复制到一个文件,并使用下面的命令提取字母数字值。
如果我们的不一致性计数较少,我们可以手动获取值,如果该数字较多,则检索整个值将非常繁忙。因此,使用下面的命令将范围缩小到alphanemeric,它可以被复制并一口气放入hbase shell中。
打开hbase hbase shell并手动分配这些一致性。如下所示:
分配完成后,再次运行hbase hbck命令
5fjcxozz2#
在HBASE2.0(可能在以前的版本中)中,“未部署在任何区域服务器上”通常通过分配区域来解决。
如果您在安全群集上,请进行身份验证。您在一个受保护的群集上,不是吗?;)
运行hbase检查以查看特定的未分配区域
如果您看到这样的错误:
(密钥为“未部署在任何区域服务器上”),则应分配该区域。事实证明,这很简单。转至步骤4。
打开hbase shell
通过将编码的regionname传递给assign方法来分配区域。如帮助文档中所述,未经先前的尽职调查,不应调用此命令,因为此命令将执行强制重新分配。医生说,我警告:仅供Maven使用。
通过对具有未分配区域的表运行hbase检查来再次检查您的工作。
如果所有操作都正确,并且没有潜在的hdfs问题,您应该在hbck输出的底部看到以下消息:
xsuvu9jc3#
我也有同样的问题。结果发现有区域重叠。如何修复:
尝试分配hbase shell中未部署的区域:分配'd…'
检查hbase主日志中的错误分配管理器[类似于:尝试分配区域{encoded=>d…,name=>…,ts=1591351130943,server=server160201581641930622}]
关闭服务器1上的区域服务器
运行hbase hbck-修复我的表
对每个未部署的区域重复此操作
或者您可以重新启动hbase并运行“hbase hbck-repair”