嗨,我有一个MR2作业,它将avro数据压缩为snappy作为输入,处理它并将数据输出到avro格式的输出目录中。期望这个输出avro数据也应该被快速压缩,但事实并非如此。MR作业是一个映射作业。
我在我的代码
中设置了以下属性 conf.set("mapreduce.map.output.compress", "true");
conf.set("mapreduce.map.output.compress.codec", "org.apache.hadoop.io.compress.SnappyCodec");
但是输出仍然不是压缩的
下面的方法就成功了
FileOutputFormat.setCompressOutput(job, true);
FileOutputFormat.setOutputCompressorClass(job, org.apache.hadoop.io.compress.SnappyCodec.class);
请注意,这必须在设置输出路径之前完成,并且顺序与上面所示的相同。
如果你想使用snappy,仅仅设置参数org.apache.hadoop.io.compress.SnappyCodec
是不够的。你应该从google下载snappy并构建它们,然后将构建文件复制到hadoop lib目录。
你可以在谷歌上搜索"如何在hadoop上使用snappy",有一篇文章,但它是用中文写的。链接
您现在拥有的是映射阶段的中间输出的压缩。相反,您应该使用以下命令(有关详细信息,请参阅本演示文稿,尤其是幻灯片9):
conf.setOutputFormat(SequenceFileOutputFormat.class);
conf.set("mapreduce.output.fileoutputformat.compress.codec", "org.apache.hadoop.io.compress.SnappyCodec");
或任何您希望的替代方案,但不要在这些配置中包含单词"map",否则它将是关于中间输出的。