破損したHDFSを誰かが修正するにはどうすればよいですか? Apache/HadoopのWebサイトを見ると、 fsck
command と書かれていましたが、修正されていません。以前にこの問題に遭遇したことがある人が、これを修正する方法を教えてくれることを願っています。
ネイティブファイルシステム用の従来の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
その出力を使用して、ブロックが存在する場所を決定します。ファイルがブロックサイズよりも大きい場合、複数のブロックが存在する可能性があります。
報告されたブロック番号を使用して、ブロックが存在していたマシンを検索するデータノードおよびネームノードログに移動できます。それらのマシンでファイルシステムエラーを探してみてください。マウントポイントがない、データノードが実行されていない、ファイルシステムが再フォーマット/再プロビジョニングされている。その方法で問題を見つけてブロックをオンラインに戻すことができれば、そのファイルは再び正常になります。
すすいで、すべてのファイルが正常になるか、ブロックを探しているすべてのファイルを使い果たすまで繰り返します。
何が起こったのかを判断し、それ以上ブロックを回復できない場合は、
hdfs fs -rm /path/to/file/with/permanently/missing/blocks
hDFSファイルシステムを正常に戻すコマンドを実行して、発生した新しいエラーの追跡を開始できるようにします。
HDFSを通常の状態に戻したいだけで、データについてはあまり気にしない場合は、
これにより、破損したHDFSブロックがリストされます。
hdfs fsck -list-corruptfileblocks
これにより、破損したHDFSブロックが削除されます。
hdfs fsck / -delete
Sudoユーザーでない場合は、Sudo -u hdfs
を使用する必要がある場合があることに注意してください(「hdfs」がSudoユーザーの名前であると想定)
ここでの解決策は私のために働いた: https://community.hortonworks.com/articles/4427/fix-under-replicated-blocks-in-hdfs-manually.html
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