哪种压缩格式适合hadoop中的大型地图输出?

时间:2013-02-01 15:08:18

标签: java hadoop compression mapreduce

我是hadoop的新手,我正在使用一个程序,它的地图输出与输入文件的大小相比非常大。

我安装了lzo库并更改了配置文件,但它对我的程序没有任何影响。我如何压缩地图输出? lzo是最好的情况吗?

如果是,我如何在我的程序中实现它?

2 个答案:

答案 0 :(得分:4)

要压缩中间输出(地图输出),需要在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的帖子,但我肯定会建议不要将其作为基本事实并做自己的基准测试。

答案 1 :(得分:2)

如果您使用的是Hadoop 0.21或更高版本,则必须在mapred-site.xml中设置这些属性:

<property>
  <name>mapreduce.map.output.compress</name>
  <value>true</value>
</property>
<property>
  <name>mapreduce.map.output.compress.codec</name>
  <value>com.hadoop.compression.lzo.LzoCodec</value>
</property>

不要忘记在更改后重新启动hadoop。还要确保安装了32位和64位liblzo2。有关如何设置此内容的详细帮助,请参阅以下链接:

https://github.com/toddlipcon/hadoop-lzo

https://code.google.com/a/apache-extras.org/p/hadoop-gpl-compression/wiki/FAQ?redir=1

除了查尔斯先生提出的观点之外,你还应该考虑另外一个方面:

  • CPU周期:您要使用的压缩算法应占用较少的CPU周期。否则,压缩成本可能会使速度优势无效或逆转。

Snappy是另一种选择,但它主要针对64-bit计算机进行了优化。如果你在32位机器上,请小心。

基于最近的进展LZ4似乎也很好,并且最近已集成到Hadoop中。它速度快但内存要求更高。您可以前往here查找有关LZ4的更多信息。

但正如查尔斯先生所说,只有经过一些实验才能做出公平的决定。