如何修复HDFS中损坏的块和复制下的块

时间:2020-01-09 10:34:31  来源:igfitidea点击:

这篇文章展示了修复HDFS中丢失或者损坏的块以及HDFS中复制块下的方法。

如何找出损坏的区块

要列出HDFS中的损坏块,可以使用以下命令。

$ hdfs fsck -list-corruptfileblocks

该命令将为我们提供丢失块的列表以及这些块所属的文件名。我们还可以使用hdfs fsck /获取有关文件系统的信息,包括损坏的块和复制的块下的信息。

如何修复损坏或者丢失的块错误

没有简单的方法可以修复损坏的块错误。如果我们可以再次复制同一文件,那是最好的做法。为此,我们可以删除带有损坏块的文件,然后再次复制该文件。

要删除块损坏的文件,请使用以下命令。

$ hdfs fsck / -delete

如果我们不想删除文件,并且想要对存储块的节点进行一些检查,则可以使用以下过程获取有关节点的信息。

使用通过运行此命令获得的文件名,hdfs fsck -list-corruptfileblocks运行以下命令以获取DataNode信息。

$ hdfs fsck /path/to/corrupt/file -locations -blocks -files

然后,我们可以检查节点是否存在任何与网络或者硬件相关的问题。

如何在复制的块下修复

要获取Hadoop中未复制的块的列表,我们可以运行以下命令。

$ hdfs fsck /

它将为我们提供文件名,块名和预期/找到的复制计数。 Hadoop框架应自动复制未完全复制的块,但我们也可以编写脚本将复制设置为所需的数量。

由于hdfs fsck /的输出采用以下格式–

/tmp/hadoop-yarn/staging/theitroad/.staging/job_1520752279140_0001/job.split:  
Under replicated BP-1309973318-127.0.1.1-1513945999329:blk_1073741921_1097. 
Target Replicas is 3 but found 1 live replica(s), 0 decommissioned replica(s), 0 decommissioning replica(s).

因此,我们可以使用以下脚本获取要在其中复制块的文件名,并将这些文件存储在临时文件中。然后迭代该临时文件,并使用-setrep命令将复制设置为所需的数字。

$ hdfs fsck / | grep 'Under replicated' | awk -F':' '{print }' >> /tmp/files
$ for underrepfile in `cat /tmp/files`; do echo "Setting replication for $underrepfile"; hdfs dfs -setrep 3 $underrepfile; done