web-dev-qa-db-ja.com

Apache Hadoopでhdfsからの読み取りまたはhdfsへのコピー時のチェックサム例外

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
19
lvella

おそらく HADOOP-7199 で説明されているバグにぶつかっています。 copyToLocalを使用してファイルをダウンロードすると、同じディレクトリにcrcファイルもコピーされるため、変更するとファイルを作成してcopyFromLocalを実行しようとすると、新しいファイルのチェックサムが実行され、ローカルcrcファイルと比較されて失敗します説明的でないエラーメッセージが表示されます。

修正するには、このcrcファイルがあるかどうかを確認してください。単に削除してやり直してください。

46
Charles Menguy

私は.crcファイルを削除することで解決された同じ問題に直面しています

2
Narendra Parmar

CRCファイルは、特定のブロックデータのシリアル番号を保持します。データ全体が一括ブロックに分割されます。各ブロックはmetadaをCRCファイルとともに/ hdfs/data/dfs/dataフォルダーに格納します。誰かがCRCファイルを修正すると、実際のCRCシリアル番号と現在のCRCシリアル番号が一致せず、エラーが発生します。このエラーを修正するためのベストプラクティスは、CRCファイルとともにメタデータファイルを上書きすることです。

1

さて、私はこの問題をなんとか解決し、誰かが同じ問題に遭遇した場合に備えて、ここに答えを書いています。

私がしたことは、単に新しいファイルを作成し、問題のあるファイルからすべての内容をコピーしたでした。

crcファイルが作成され、その特定のファイルに添付されているように見えるので、別のファイルを試すことにより、別のcrcチェックを行います。別の理由として、ファイルにattr.txtという名前を付けたことが考えられます。これは、他のリソースと競合するファイル名である可能性があります。技術的な詳細について100%確信が持てず、これらは私の観察にすぎないため、誰かが私の答えをさらに拡張する可能性があります。

1
lvella