哪种压缩格式适用于 Hadoop 中的大地图输出



我是Hadoop的新手,我正在使用一个程序,它的map输出与输入文件的大小非常大。

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

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

要压缩中间输出(您的地图输出),您需要在 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>

如果要基于每个作业的作业执行此操作,还可以通过以下 1 种方式直接在代码中实现它:

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听起来也是一个很好的候选人。我在这里找到了一篇提出压缩基准的帖子,但我绝对建议不要将其视为基本事实,而是做自己的基准。

如果您使用的是 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中。它速度很快,但内存要求更高。您可以转到此处以了解有关LZ4的更多信息。

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

相关内容

  • 没有找到相关文章

最新更新