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

yeotifhr  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(473)

我想输出 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 格式。
有人能帮我吗?谢谢!

更多:
我只是看了一下 setOutputCompressorClassFileOutputFormat ,其中 conf.setClass("mapred.output.compression.codec", codecClass, CompressionCodec.class); 似乎在调用setoutputcompressorclass时,配置中的mapred.output.compression.codec将被重置。
所以实际的压缩格式是我们最后设置的,我们不能在同一个作业中设置两种不同的压缩格式?还是有什么被忽视了?

8ehkhllq

8ehkhllq1#

因此,作为一种解决方法,可以尝试直接在配置中设置正确的outputcompressorclass

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

就在对每个输出进行写调用之前。看起来,除了键类、值类和输出路径之外的任何输出格式配置参数都不能通过多次输出很好地处理,我们可能需要编写一些代码来抵消这种疏忽。

相关问题