Apache hadoopを使用して並列化アルゴリズムを実装しようとしていますが、ローカルファイルシステムからhdfsにファイルを転送しようとすると、いくつかの問題に直面しています。 チェックサム例外は、ファイルの読み取りまたは転送を試行するとスローされます。
奇妙なことに、一部のファイルは正常にコピーされているが、正常にコピーされていない(2つのファイルを試してみました。私が行った別の観察は、JavaFileSystem.getFileChecksumメソッドがnullをすべて返していることですケース。
私が達成しようとしていることに関する若干の背景:私が書いたmapreduceジョブの分散キャッシュとして使用できるように、ファイルをhdfsに書き込もうとしています。
端末からhadoop fs -copyFromLocalコマンドも試しましたが、結果はJavaコード。
私はここでStackoverflowに関する他の質問を含め、Web全体を調べましたが、問題を解決することができませんでした。私はまだhadoopにかなり慣れていないので、どんな助けにも感謝します。
スローされている例外を示す以下のスタックトレースを添付しています。 (この場合、hadoop fs -copyFromLocalコマンドからのスタックトレースをターミナルから投稿しました)
name@ubuntu:~/Desktop/hadoop2$ bin/hadoop fs -copyFromLocal ~/Desktop/dtlScaleData/attr.txt /tmp/hadoop-name/dfs/data/attr2.txt
13/03/15 15:02:51 INFO util.NativeCodeLoader: Loaded the native-hadoop library
13/03/15 15:02:51 INFO fs.FSInputChecker: Found checksum error: b[0, 0]=
org.Apache.hadoop.fs.ChecksumException: Checksum error: /home/name/Desktop/dtlScaleData/attr.txt at 0
at org.Apache.hadoop.fs.ChecksumFileSystem$ChecksumFSInputChecker.readChunk(ChecksumFileSystem.Java:219)
at org.Apache.hadoop.fs.FSInputChecker.readChecksumChunk(FSInputChecker.Java:237)
at org.Apache.hadoop.fs.FSInputChecker.read1(FSInputChecker.Java:189)
at org.Apache.hadoop.fs.FSInputChecker.read(FSInputChecker.Java:158)
at Java.io.DataInputStream.read(DataInputStream.Java:100)
at org.Apache.hadoop.io.IOUtils.copyBytes(IOUtils.Java:68)
at org.Apache.hadoop.io.IOUtils.copyBytes(IOUtils.Java:47)
at org.Apache.hadoop.io.IOUtils.copyBytes(IOUtils.Java:100)
at org.Apache.hadoop.fs.FileUtil.copy(FileUtil.Java:230)
at org.Apache.hadoop.fs.FileUtil.copy(FileUtil.Java:176)
at org.Apache.hadoop.fs.FileSystem.copyFromLocalFile(FileSystem.Java:1183)
at org.Apache.hadoop.fs.FsShell.copyFromLocal(FsShell.Java:130)
at org.Apache.hadoop.fs.FsShell.run(FsShell.Java:1762)
at org.Apache.hadoop.util.ToolRunner.run(ToolRunner.Java:65)
at org.Apache.hadoop.util.ToolRunner.run(ToolRunner.Java:79)
at org.Apache.hadoop.fs.FsShell.main(FsShell.Java:1895)
copyFromLocal: Checksum error: /home/name/Desktop/dtlScaleData/attr.txt at 0
おそらく HADOOP-7199 で説明されているバグにぶつかっています。 copyToLocal
を使用してファイルをダウンロードすると、同じディレクトリにcrcファイルもコピーされるため、変更するとファイルを作成してcopyFromLocal
を実行しようとすると、新しいファイルのチェックサムが実行され、ローカルcrcファイルと比較されて失敗します説明的でないエラーメッセージが表示されます。
修正するには、このcrcファイルがあるかどうかを確認してください。単に削除してやり直してください。
私は.crcファイルを削除することで解決された同じ問題に直面しています
CRCファイルは、特定のブロックデータのシリアル番号を保持します。データ全体が一括ブロックに分割されます。各ブロックはmetadaをCRCファイルとともに/ hdfs/data/dfs/dataフォルダーに格納します。誰かがCRCファイルを修正すると、実際のCRCシリアル番号と現在のCRCシリアル番号が一致せず、エラーが発生します。このエラーを修正するためのベストプラクティスは、CRCファイルとともにメタデータファイルを上書きすることです。
さて、私はこの問題をなんとか解決し、誰かが同じ問題に遭遇した場合に備えて、ここに答えを書いています。
私がしたことは、単に新しいファイルを作成し、問題のあるファイルからすべての内容をコピーしたでした。
crcファイルが作成され、その特定のファイルに添付されているように見えるので、別のファイルを試すことにより、別のcrcチェックを行います。別の理由として、ファイルにattr.txtという名前を付けたことが考えられます。これは、他のリソースと競合するファイル名である可能性があります。技術的な詳細について100%確信が持てず、これらは私の観察にすぎないため、誰かが私の答えをさらに拡張する可能性があります。