【发布时间】:2012-10-18 10:55:23
【问题描述】:
我想在一个作业中同时输出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 格式。
有人可以帮助我吗?谢谢!
================================================ =============================
更多:
刚刚在FileOutputFormat中查看了setOutputCompressorClass的源码,其中conf.setClass("mapred.output.compression.codec", codecClass, CompressionCodec.class);
似乎在调用 setOutputCompressorClass 时,配置中的 mapred.output.compression.codec 会被重置。
所以实际的压缩格式是我们最后设置的,不能在同一个job中设置两种不同的压缩格式?或者还有什么被忽略的?
【问题讨论】:
-
您是否确认您的 GBKTextOutputFormat 在用作未运行 MultipleOutput 的 reducer 中的唯一输出格式类型时有效?另外,在您的自定义输出格式类中,压缩类在 getRecordWriter() 方法中设置为 GzipCodec 以外的其他内容?
-
我的意思是默认压缩类...