我是hadoop新手,我正在使用一个程序,它的map输出与输入文件的大小相比非常大。我安装了lzo库并更改了配置文件,但对我的程序没有任何影响。如何压缩Map输出?lzo是最好的案子吗?如果是,如何在我的程序中实现?
flseospp1#
如果使用的是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-lzohttps://code.google.com/a/apache-extras.org/p/hadoop-gpl-compression/wiki/faq?redir=1除了查尔斯爵士的观点外,你还应该记住一个方面:cpu周期:您将要使用的压缩算法应该消耗较少的cpu周期。否则,压缩成本可能会使速度优势无效或逆转。snappy是另一个选项,但它主要针对 64-bit 机器。如果你在32位机器上,最好小心。根据最近的进展 LZ4 看起来也不错,最近已经集成到hadoop中。它速度很快,但内存要求更高。你可以在这里找到更多关于lz4的信息。但正如查尔斯爵士所说,只有经过一些实验,才能做出公正的决定。
64-bit
LZ4
ahy6op9u2#
要压缩中间输出(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性能差的压缩编解码器。很难告诉你该用哪一个,不该用哪一个,这也取决于你的数据,所以你应该试几个,看看什么更有意义。以我的经验,斯内皮和lzo是最有效率的。最近我听说lzf听起来也是个不错的候选人。我在这里发现了一个提议压缩基准的帖子,但我绝对建议不要把它当作基本事实,而是做你自己的基准。
mapred.output.compression.type
RECORD
BLOCK
2条答案
按热度按时间flseospp1#
如果使用的是hadoop 0.21或更高版本,则必须在mapred-site.xml中设置这些属性:
并且不要忘记在更改之后重新启动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的信息。但正如查尔斯爵士所说,只有经过一些实验,才能做出公正的决定。
ahy6op9u2#
要压缩中间输出(Map输出),需要在mapred-site.xml中设置以下属性:
如果要按每个作业执行,还可以通过以下方式之一在代码中直接实现:
或
另外值得一提的是
mapred.output.compression.type
应保留默认值RECORD
,因为BLOCK
中间输出的压缩会导致性能下降。在选择要使用的压缩类型时,我认为您需要考虑两个方面:
压缩比:实际发生的压缩量。百分比越高,压缩效果越好。
io性能:由于压缩是io密集型操作,不同的压缩方法具有不同的性能含义。
目标是平衡压缩比和io性能,你可以有一个压缩率非常高,但io性能差的压缩编解码器。
很难告诉你该用哪一个,不该用哪一个,这也取决于你的数据,所以你应该试几个,看看什么更有意义。以我的经验,斯内皮和lzo是最有效率的。最近我听说lzf听起来也是个不错的候选人。我在这里发现了一个提议压缩基准的帖子,但我绝对建议不要把它当作基本事实,而是做你自己的基准。