如何修复损坏的HDFS FIles

Cla*_*ied 56 hadoop hdfs

有人如何修复腐败的HDFS?我查看了Apache/Hadoop网站,它说它的fsck命令,但没有解决它.希望之前遇到此问题的人可以告诉我如何解决这个问题.

与用于本机文件系统的传统fsck实用程序不同,此命令不会更正它检测到的错误.通常,NameNode会自动更正大多数可恢复的故障.

当我运行时bin/hadoop fsck / -delete,它列出了损坏或丢失块的文件.我如何让它不腐败?这是在练习机器上,所以我可以把所有东西吹走,但是当我们上线时,我将无法通过吹掉所有东西来"修复"它,所以我现在想要解决它.

mob*_*ent 90

您可以使用

  hdfs fsck /
Run Code Online (Sandbox Code Playgroud)

确定哪些文件有问题.查看输出中是否存在丢失或损坏的块(暂时忽略未复制的块).这个命令真的很冗长,尤其是在一个大型HDFS文件系统上,所以我通常会得到有意义的输出

  hdfs fsck / | egrep -v '^\.+$' | grep -v eplica
Run Code Online (Sandbox Code Playgroud)

除了点和线谈论复制之外什么都忽略了.

一旦找到损坏的文件

  hdfs fsck /path/to/corrupt/file -locations -blocks -files
Run Code Online (Sandbox Code Playgroud)

使用该输出来确定块可能存在的位置.如果文件大于块大小,则可能有多个块.

您可以使用报告的块编号转到datanode,并使用namenode日志搜索块所在的机器.尝试在这些计算机上查找文件系统错误.缺少挂载点,datanode未运行,文件系统重新格式化/重新配置.如果您能以这种方式找到问题并将该块重新联机,那么该文件将再次健康.

泡沫冲洗并重复,直到所有文件都健康或您耗尽所有替代品寻找块.

一旦你确定发生了什么,你无法恢复任何更多的块,只需使用

  hdfs fs -rm /path/to/file/with/permanently/missing/blocks
Run Code Online (Sandbox Code Playgroud)

命令让您的HDFS文件系统恢复健康,以便您可以在发生新错误时开始跟踪它们.

  • 但是如果一个文件在集群中被复制3次,我不能从另一个节点恢复它吗?我知道我在一台机器上有一些数据丢失,但这不是HDFS的全部意义,这不重要吗? (12认同)
  • 谢谢你的回复.我会在下次HDFS出现问题时尝试你的建议.不知何故,当我运行`bin/hadoop fsck/-delete`时,它自行修复了.之后,HDFS不再损坏,一些文件最终输入/丢失+找到.在我停止HDFS并重新启动几次之前,它没有这样做.我再次投票并接受了你的答案=)Thx. (4认同)
  • 不会删除丢失的块导致数据丢失吗?hdfs fs -rm / path / to / file / with / permanently / missing / blocks @mobileAgent (3认同)
  • 有时,应用程序写入的中间数据是临时数据,可以在发生故障时轻松重新生成,因此以复制因子 1 进行存储。如果这些类型的应用程序因任何原因崩溃并且不进行清理,它们将留下这些数据。如果在未来的某个时刻,具有一个副本的 DataNode 崩溃,您将看到损坏的块。这种情况经常发生,没什么大不了的。可以安全地删除这些数据以恢复集群的健康状况。 (2认同)

dae*_*n12 16

如果您只是想让HDFS恢复正常状态并且不担心数据,那么

这将列出损坏的HDFS块:

hdfs fsck -list-corruptfileblocks

这将删除损坏的HDFS块:

hdfs fsck / -delete

请注意,sudo -u hdfs如果您不是sudo用户,则可能必须使用(假设"hdfs"是sudo用户的名称)