3

gzip1つのジョブで出力とlzoフォーマットを同時に行いたい。

私はを使用MultipleOutputsし、次のような2つの名前付き出力を追加しました。

MultipleOutputs.addNamedOutput(job, "LzoOutput", GBKTextOutputFormat.class, Text.class, Text.class);

GBKTextOutputFormat.setOutputCompressorClass(job, LzoCodec.class);

MultipleOutputs.addNamedOutput(job, "GzOutput", TextOutputFormat.class, Text.class, Text.class);

TextOutputFormat.setOutputCompressorClass(job, GzipCodec.class);

GBKTextOutputFormatここは自分で書いたもので、拡張されていますFileOutputFormat

それらは次のようなレデューサーで使用されます:

multipleOutputs.write("LzoOutput", NullWritable.get(), value, "/user/hadoop/lzo/"+key.toString());

multipleOutputs.write("GzOutput", NullWritable.get(), value, "/user/hadoop/gzip/"+key.toString());

結果は次のとおりです。

2つのパスで出力を取得できますが、どちらもgzipフォーマットです。

誰かが私を助けることができますか?ありがとう!

================================================== ========================

もっと:

setOutputCompressorClassのソースコードを見たところFileOutputFormatconf.setClass("mapred.output.compression.codec", codecClass, CompressionCodec.class);

setOutputCompressorClassが呼び出されると、構成内のmapred.output.compression.codecがリセットされるようです。

したがって、実際の圧縮形式は最後に設定したものであり、同じジョブで2つの異なる圧縮形式を設定することはできませんか?または他に無視されているものがありますか?

4

1 に答える 1

2

したがって、回避策として、構成で直接正しいoutputCompressorClassを設定してみてください

context.getConfiguration().setOutputCompressorClass(GzipCodec.class);

各出力への書き込み呼び出しの直前。キークラス、値クラス、出力パス以外の出力形式の構成パラメーターは、MultipleOutputsによって適切に処理されないように見えます。その見落としを相殺するために、少しコードを記述しなければならない場合があります。

于 2012-10-18T22:38:49.247 に答える