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 を使用して解決策を見つけることができれば、それが望ましいでしょう。