我是 hadoop 的新手,我正在使用一个程序,它的 map 输出与输入文件的大小相比非常大。
我安装了 lzo 库并更改了配置文件,但它对我的程序没有任何影响。我如何压缩 map 输出? lzo 是最好的情况吗?
如果是,我如何在我的程序中实现它?
最佳答案
要压缩中间输出(您的 map 输出),您需要在 mapred-site.xml 中设置以下属性:
<property>
<name>mapred.compress.map.output</name>
<value>true</value>
</property>
<property>
<name>mapred.map.output.compression.codec</name>
<value>org.apache.hadoop.io.compress.LzoCodec</value>
</property>
如果您想在每个作业的基础上执行此操作,您还可以通过以下方式之一直接在您的代码中实现它:
conf.set("mapred.compress.map.output", "true")
conf.set("mapred.map.output.compression.codec", "org.apache.hadoop.io.compress.LzoCodec");
或
jobConf.setMapOutputCompressorClass(LzoCodec.class);
另外值得一提的是,属性mapred.output.compression.type
应该保留为默认值RECORD
,因为BLOCK
压缩对于中间输出会导致性能不佳。
在选择要使用的压缩类型时,我认为您需要考虑两个方面:
- 压缩率:实际发生了多少压缩。 % 越高,压缩效果越好。
- IO 性能:由于压缩是 IO 密集型操作,不同的压缩方法具有不同的性能影响。
目标是平衡压缩率和 IO 性能,您可以拥有压缩率非常高但 IO 性能较差的压缩编解码器。
真的很难告诉你应该使用哪个,不应该使用哪个,这也取决于你的数据,所以你应该尝试几个,看看哪个更有意义。根据我的经验,Snappy 和 LZO 是最有效的。最近我听说了 LZF,这听起来也是一个不错的候选人。我发现了一篇提出压缩基准的帖子 here ,但我绝对建议不要将其作为基本事实并做自己的基准测试。
关于java - 哪种格式的compress适合hadoop中的大图输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14649190/