0

Hadoop MR ジョブの出力を次のように圧縮しています。

conf.setOutputFormat(TextOutputFormat.class);
TextOutputFormat.setCompressOutput(conf, true);
TextOutputFormat.setOutputCompressorClass(conf, GzipCodec.class);

次のように MultipleOutputs を使用しています。

MultipleOutputs.addMultiNamedOutput(conf, "a", TextOutputFormat.class, Text.class, Text.class);
MultipleOutputs.addNamedOutput(conf, "b", TextOutputFormat.class, Text.class, Text.class);
LazyOutputFormat.setOutputFormatClass(conf, TextOutputFormat.class);

個別に、これらのそれぞれはうまく機能します。必要な出力の分割を取得でき、gzip された出力を持つことができます。ただし、これらを一緒に使用すると、gzip で圧縮されたファイルが最後に破損しているように見えます。各出力ファイルには約 25000 行あります。私が何かをするとき

hadoop dfs -cat output/*.gz | less +24000

すべてが正常に見えます。でももしそうなら

hadoop dfs -cat output/*.gz | less +40000

次のようなエラーが表示されます

zcat: stdin: invalid compressed data--crc error
zcat: stdin: invalid compressed data--length error
zcat: stdin: invalid compressed data--format violated

最初のコマンドを繰り返してファイルのスキャンを開始すると、最終的に、不完全な行またはいくつかの非常に長く非常に破損した行の後に上記のエラーのいずれかが発生します (改行文字も破損しているため、それらは長いと思います) less。もう行く必要はありません。

だから、私の質問は: 誰かがこれを以前に見たことがありますか?それを修正する方法はありますか?

注: mapreduce の代わりに mapred API を使用しています。新しい API への変換を試みることはできますが、mapred を使用して解決策を見つけることができれば、それが望ましいでしょう。

4

1 に答える 1

3

単なる推測 (レデューサー コードを見ずに) ですMultipleOutputs.close()が、レデューサーのクリーンアップ メソッドで (存在しない静的メソッドではなく、MultipleOutputs のインスタンスで) 呼び出していますか?

gzip ファイルの最終ブロックが書き込まれていないようです - 上記のメソッドを呼び出さないことと一致しています

于 2013-01-01T16:26:55.433 に答える