java - 哪种格式的compress适合hadoop中的大图输出?

标签 java hadoop compression mapreduce

我是 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/

相关文章:

java - 创建表的实体

java - 从头开始为 JRE 创建 Docker 镜像

hadoop - Hive Beeswax正常工作时,Hive CLI不填充表数据(从“创建表作为选择查询”)

php - 编码数据的最佳方式

c++ - Targa 运行长度编码

java - 是否有任何java压缩实用程序

java - 有人能告诉我内部类的目的以及迭代器模式是否应该或使用内部类的好主意吗?

java - 基于 2 个对象对列表中的元素进行分组,如果它们具有相同的值,则仅显示该元素一次,并显示计数

python - 在Amazon EMR上运行mrjob,不支持t2.micro

hadoop - Hadoop字数统计失败,文件很大