mapreduce 作业未正确设置压缩编解码器

mapreduce job not setting compression codec correctly

您好,我有一个 MR2 作业,它将使用 snappy 压缩的 avro 数据作为输入,对其进行处理并将数据输出到输出目录中,并转换为 avro 格式。期望这个输出 avro 数据也应该被快速压缩,但事实并非如此。 MR 作业是仅限地图的作业。

我在我的代码中设置了以下属性

conf.set("mapreduce.map.output.compress", "true"); conf.set("mapreduce.map.output.compress.codec", "org.apache.hadoop.io.compress.SnappyCodec");

但输出仍然没有被快速压缩

如果要使用snappy,只设置参数org.apache.hadoop.io.compress.SnappyCodec是不够的。您应该从 google 下载 snappy 并构建它们,然后将构建文件复制到 hadoop lib 目录。

你可以在google"how to use snappy on hadoop"上搜索,有一个post,但是是用中文写的。 link

您现在拥有的是映射阶段的中间输出的压缩。相反,您应该使用以下命令(有关详细信息,请参阅 this presentation 尤其是幻灯片 9):

conf.setOutputFormat(SequenceFileOutputFormat.class);
conf.set("mapreduce.output.fileoutputformat.compress.codec", "org.apache.hadoop.io.compress.SnappyCodec");

或您希望的任何替代方案,但不要在这些配置中包含单词 "map",否则它将是关于中间输出。

以下方法成功了 FileOutputFormat.setCompressOutput(job, true); FileOutputFormat.setOutputCompressorClass(job, org.apache.hadoop.io.compress.SnappyCodec.class);

请注意,这确实在设置输出路径之前完成,并且顺序与上面显示的相同。