24

Apache hadoopを使用して並列化アルゴリズムを実装しようとしていますが、ローカルファイルシステムからhdfsにファイルを転送しようとすると、いくつかの問題が発生します。ファイルからの読み取りまたはファイルの転送を試みると、チェックサム例外がスローされます。

奇妙なことに、一部のファイルは正常にコピーされていますが、他のファイルは正常にコピーされていません(2つのファイルを試してみましたが、一方はもう一方より少し大きく、両方ともサイズが小さいです)。私が行ったもう1つの観察結果は、JavaFileSystem.getFileChecksumメソッドがすべての場合にnullを返していることです。

私が達成しようとしていることのわずかな背景:私が書いたmapreduceジョブの分散キャッシュとして使用できるように、hdfsにファイルを書き込もうとしています。

また、ターミナルからhadoop fs -copyFromLocalコマンドを試しましたが、結果はJavaコードを介して実行した場合とまったく同じ動作になります。

私はここスタックオーバーフローに関する他の質問を含めてウェブ全体を見てきましたが、問題を解決することができませんでした。私はまだ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
4

5 に答える 5

61

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

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

于 2013-03-15T22:04:10.263 に答える
4

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

于 2016-03-25T18:09:43.643 に答える
1

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

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

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

于 2013-03-16T07:25:31.960 に答える
1

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

于 2013-05-20T07:32:35.320 に答える
-3

私はまったく同じ問題を抱えていて、解決策を見つけられませんでした。これが私の最初のHadoopエクスペリエンスであったため、インターネットを介した指示に従うことができませんでした。namenodeをフォーマットすることで、この問題を解決しました。

hadoop namenode -format
于 2014-05-02T09:23:27.673 に答える