Hadoop:如何在同一个作业中输出不同的格式类型?

时间:2012-10-18 10:55:23

标签: hadoop mapreduce gzip lzo

我想在一个作业中同时输出gziplzo格式。

我使用了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格式。

有人可以帮帮我吗?谢谢!

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

更多:

我刚看了setOutputCompressorClassFileOutputFormat的源代码,其中conf.setClass("mapred.output.compression.codec", codecClass, CompressionCodec.class);

调用setOutputCompressorClass时,似乎会重置配置中的mapred.output.compression.codec。

所以实际压缩格式是我们最后设置的格式,我们不能在同一个作业中设置两种不同的压缩格式?还是有别的东西被忽略了?

1 个答案:

答案 0 :(得分:2)

所以也许作为解决方法,尝试直接在配置中设置正确的outputCompressorClass

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

在您对每个输出的写入调用之前。看起来像任何输出格式配置参数除了密钥类,值类和输出路径以外,MultipleOutputs都不能很好地处理它们,我们可能需要编写一些代码来抵消这种疏忽。