Я хочу выводить форматы gzip
и lzo
одновременно в одном задании.
Я использовал MultipleOutputs
и добавил два именованных выхода, например:
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());
Результат:
Я могу получить выходные данные по двум путям, но они оба в формате gzip
.
Кто-нибудь может мне помочь? Спасибо!
==========================================================================
Более:
Я только что посмотрел исходный код setOutputCompressorClass
в FileOutputFormat
, в котором conf.setClass("mapred.output.compression.codec", codecClass, CompressionCodec.class);
Кажется, что mapred.output.compression.codec в конфигурации будет сброшен при вызове setOutputCompressorClass.
Таким образом, фактический формат сжатия — это тот, который мы установили в конце, и мы не можем установить два разных формата сжатия в одном и том же задании? Или что-то еще игнорируется?