在重新安装一个节点之后如何修复Hadoop HDFS集群中丢失的块?

我有一个5从属Hadoop集群(使用CDH4)—从站是DataNode和TaskNode运行的地方。 每个从设备有4个专用于HDFS存储的分区。 其中一个奴隶需要重新安装,这导致其中一个HDFS分区丢失。 在这一点上,HDFS抱怨约35K失踪的块。

几天后,重新安装完成,我把节点重新联机到Hadoop。 HDFS保持安全模式,新的服务器没有注册到其他节点块的数量附近。 例如,在DFS Admin下,新节点显示它具有6K块,而其他节点具有约400K块。

目前,新节点的DataNode日志显示它正在对各种块进行validation(或复制?),其中一些块已经失效。 我相信这是HDFS只是将现有数据复制到新节点。 validation示例:

2013-08-09 17:05:02,113 INFO org.apache.hadoop.hdfs.server.datanode.BlockPoolSliceScanner: Verification succeeded for BP-143510735-141.212.113.141-1343417513962:blk_6568189110100209829_1733272 

失败的例子:

 2013-08-09 17:04:48,100 ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: meez02.eecs.umich.edu:50010:DataXceiver error processing REPLACE_BLOCK operation src: /141.212.113.141:52192 dest: /141.212.113.65:50010 org.apache.hadoop.hdfs.server.datanode.ReplicaAlreadyExistsException: Block BP-143510735-141.212.113.141-1343417513962:blk_-4515068373845130948_756319 already exists in state FINALIZED and thus cannot be created. at org.apache.hadoop.hdfs.server.datanode.fsdataset.impl.FsDatasetImpl.createTemporary(FsDatasetImpl.java:813) at org.apache.hadoop.hdfs.server.datanode.fsdataset.impl.FsDatasetImpl.createTemporary(FsDatasetImpl.java:92) at org.apache.hadoop.hdfs.server.datanode.BlockReceiver.<init>(BlockReceiver.java:155) at org.apache.hadoop.hdfs.server.datanode.DataXceiver.replaceBlock(DataXceiver.java:846) at org.apache.hadoop.hdfs.protocol.datatransfer.Receiver.opReplaceBlock(Receiver.java:137) at org.apache.hadoop.hdfs.protocol.datatransfer.Receiver.processOp(Receiver.java:70) at org.apache.hadoop.hdfs.server.datanode.DataXceiver.run(DataXceiver.java:221) at java.lang.Thread.run(Thread.java:679) 

在DFS Admin中,我也可以看到这个新节点的容量是61%(与其他节点的近似使用率相匹配),尽pipe它的块数大约是其他节点的2%。 我猜这只是HDFS无法识别的旧数据。

我怀疑有一件事情发生了:(a)HDFS由于陈旧而放弃了这个节点的数据; (b)重新安装改变了一些系统参数,所以HDFS把它作为一个全新的节点(即不是现有的一个数据)。 或者(c)驱动器映射出现混乱,导致分区映射发生变化,HDFS无法find旧数据(尽pipe驱动器有标签,我确信我们有这个权利)。

主要问题:如何让HDFS重新识别该驱动器上的数据?

  • 回答:重新启动NameNode,节点将重新报告它们具有的块(请参阅下面的更新1)

子问题1:如果我对新节点的数据使用情况的假设是正确的 – 61%的使用是虚幻数据 – 它是否被HDFS清除了,还是我需要手动删除?

  • 问题不大:由于大部分的驱动似乎被认可(参见下面的更新1)

子问题2:目前,由于“复制队列尚未初始化”,我无法运行listCorruptFileBlocks来查找丢失的块。 任何想法如何解决这个问题? 我是否必须等待新节点重新平衡(即validation/复制阶段结束)?

  • 回答:离开安全模式让我运行这个(见下面的更新1)

更新

更新1:我以为我已经通过重新启动我的NameNode解决了这个问题。 这导致新节点的块数跳转到与其他节点大致相同的使用率,DFS将其消息更改为:

安全模式打开。 报告的块629047需要额外的8172个块才能达到总块637856的阈值0.9990。安全模式将自动closures。

我把它留在这个状态好几个小时,希望最终能够离开安全模式,但没有任何改变。 然后,我手动closures安全模式,并将DFS的消息更改为“8800块丢失”。 此时,我能够运行hdfs fsk -list-corruptfileblocks ,查看大部分缺less块的文件。

目前剩余的问题:如何获得这些失踪块恢复…(我应该旋转在新的问题呢?)

我最后不得不删除坏块的文件,经过进一步调查,我意识到有一个非常低的复制(rep = 1,如果我没记错的话)。

这个SOpost有更多的信息find坏块的文件,使用的东西沿线:

 hadoop fsck / | egrep -v '^\.+$' | grep -v eplica 

所以,回答我自己的问题:

  1. 这些文件可以恢复吗? 除非发生故障的节点/驱动器重新联机并丢失数据。
  2. 如何退出安全模式? 删除这些麻烦的文件,然后通过dfsadmin离开安全模式。