我想在一个作业中同时输出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);
调用setOutputCompressorClass时,似乎会重置配置中的mapred.output.compression.codec。
所以实际压缩格式是我们最后设置的格式,我们不能在同一个作业中设置两种不同的压缩格式?还是有别的东西被忽略了?
答案 0 :(得分:2)
所以也许作为解决方法,尝试直接在配置中设置正确的outputCompressorClass
context.getConfiguration().setOutputCompressorClass(GzipCodec.class);
在您对每个输出的写入调用之前。看起来像任何输出格式配置参数除了密钥类,值类和输出路径以外,MultipleOutputs都不能很好地处理它们,我们可能需要编写一些代码来抵消这种疏忽。