Hadoop 如何修复损坏的HDFS文件

Hadoop 如何修复损坏的HDFS文件,hadoop,hdfs,Hadoop,Hdfs,如何修复损坏的HDFS?我在Apache/Hadoop网站上看到,它说是的,但这并不能解决问题。希望以前遇到过这个问题的人能告诉我如何解决这个问题 与用于本机文件系统的传统fsck实用程序不同,此命令不会更正它检测到的错误。通常,NameNode会自动更正大多数可恢复故障 当我运行bin/hadoop fsck/-delete时,它列出了损坏或丢失块的文件。我如何使它不腐败?这是在一台练习机上,所以我可以把所有东西都吹走,但当我们上线时,我无法通过吹走所有东西来“修复”它,所以我现在正在尝试解决

如何修复损坏的HDFS?我在Apache/Hadoop网站上看到,它说是的,但这并不能解决问题。希望以前遇到过这个问题的人能告诉我如何解决这个问题

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

当我运行
bin/hadoop fsck/-delete
时,它列出了损坏或丢失块的文件。我如何使它不腐败?这是在一台练习机上,所以我可以把所有东西都吹走,但当我们上线时,我无法通过吹走所有东西来“修复”它,所以我现在正在尝试解决它。

你可以使用

  hdfs fsck /
确定哪些文件有问题。查看输出中是否有丢失或损坏的块(暂时忽略已复制块下的内容)。这个命令真是太棒了 冗长,尤其是在大型HDFS文件系统上,因此我通常会着手 有意义的输出

  hdfs fsck / | egrep -v '^\.+$' | grep -v eplica
它忽略了线,除了点和线,什么都没有,只是在谈论复制

一旦发现损坏的文件

  hdfs fsck /path/to/corrupt/file -locations -blocks -files
使用该输出确定块可能存在的位置。如果文件是 如果大于块大小,则可能有多个块

您可以使用报告的区块编号转到 datanodes和namenode日志搜索一台或多台计算机 街区居住的地方。尝试查找文件系统错误 在那些机器上。缺少装入点,datanode未运行, 文件系统已重新格式化/重新设置。如果你能找到问题 这样,并使块重新联机,该文件将是健康的 再说一遍

用泡沫冲洗并重复,直到所有锉刀都清洁干净或排尽 所有的替代品都在寻找区块

一旦确定发生了什么并且无法恢复更多的块, 只要使用

  hdfs fs -rm /path/to/file/with/permanently/missing/blocks
命令使HDFS文件系统恢复正常,以便启动
在出现新错误时跟踪它们。

启动所有守护程序,并以“hadoop namenode-recover-force”的形式运行命令停止守护程序,然后重新启动。。请等待一段时间以恢复数据

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

这将列出损坏的HDFS块:

hdfs fsck-列出损坏的文件块

这将删除损坏的HDFS块:

hdfs fsck/-delete


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

这里的解决方案对我有效:

su-
bash-4.1$hdfs fsck/| grep'在复制的| awk-F'下:'{print$1}'>>/tmp/Under|u replicated|u文件下
-bash-4.1$用于“cat/tmp/under_replicated_files”中的hdfsfile;执行echo“修复$hdfsfile:”;hadoop fs-setrep 3$hdfsfile;完成

谢谢您的回复。下次HDFS出现问题时,我会尝试你的建议。不知何故,当我运行
bin/hadoop fsck/-delete
时,它修复了自己。在此之后,HDFS不再损坏,一些文件以/lost+found结束。在我停止HDFS并重新启动几次之前,它没有这样做。我再次投票并接受了你的答案=)Thx。但是如果一个文件在集群中复制了3次,我就不能从另一个节点取回它吗?我知道我在一台机器上丢失了一些数据,但HDFS的全部意义不就是说这不重要吗?我已经做了很多次了,但没有解决这个问题。但我知道,没有其他选项可以恢复hdfs中损坏或丢失的数据。尽管清除了所有数据节点的数据,但我仍然可以看到损坏的块问题。只有一个节点出现问题(它崩溃并丢失了一些文件),最简单的解决方案是@Classified建议的解决方案,只需执行hadoop fsck/-delete删除丢失的块不会导致数据丢失吗?hdfs fs-rm/path/to/file/with/permanently/missing/blocks@mobileAgentI在运行上述命令之前还必须翻转我的主名称节点,因为它已进入安全模式。翻转集合使备用节点变为活动状态,我可以运行上述命令并清除损坏的块:)
su - <$hdfs_user>

bash-4.1$ hdfs fsck / | grep 'Under replicated' | awk -F':' '{print $1}' >> /tmp/under_replicated_files 

-bash-4.1$ for hdfsfile in `cat /tmp/under_replicated_files`; do echo "Fixing $hdfsfile :" ;  hadoop fs -setrep 3 $hdfsfile; done