2011-04-06 90 views
23

我有,我尽量只压缩映射器输出,但不减速机输出地图,减少Java程序。我认为这可以通过在配置实例中设置下列属性来实现。但是,当我运行我的作业时,Reducer生成的输出仍然被压缩,因为生成的文件是:part-r-00000.gz。有没有人成功地压缩了映射器数据但不是减速器?这甚至有可能吗?Hadoop的,如何压缩映射器输出,但不减速机输出

//压缩映射器输出

conf.setBoolean("mapred.output.compress", true); 
conf.set("mapred.output.compression.type", CompressionType.BLOCK.toString()); 
conf.setClass("mapred.output.compression.codec", GzipCodec.class, CompressionCodec.class); 

回答

21

随着MR2,现在我们应该设置

conf.set("mapreduce.map.output.compress", true) 
conf.set("mapreduce.output.fileoutputformat.compress", false) 

欲了解更多详情,请参阅:http://hadoop.apache.org/docs/stable/hadoop-mapreduce-client/hadoop-mapreduce-client-core/mapred-default.xml

+0

如果有人感兴趣这是如何适用于avro的,因为avro仅支持快速和放缩,这种配置是最好的。最终减少的文件名称不会改变,但您会发现文件大小因内部块级别上的压缩而发生变化。 更多详细信息,请访问:http://www.quora.com/Can-avro-data-files-be-lzop-compressed-in-Hadoop – 2014-11-26 07:49:53

+0

您是否在向EMR添加步骤时设置了这些设置? – 2016-06-03 08:01:08

11

“输出压缩” 将压缩你的最终输出。如果只压缩地图输出,使用这样的:

conf.set("mapred.compress.map.output", "true") 
    conf.set("mapred.output.compression.type", "BLOCK"); 
    conf.set("mapred.map.output.compression.codec", "org.apache.hadoop.io.compress.GzipCodec"); 
+0

使用gzip压缩为不是一个好主意。主要问题是它不可拆分。 – 2011-04-07 15:31:30

+6

为什么?我认为mapper输出不会被拆分,只有在使用reducer或identity reducer时输出可能会被拆分。 – Marcin 2011-04-07 17:59:29

+0

我的理解是使用GZIP压缩输入数据不是一个好主意。原因是它不是可拆分的。使用gzip进行地图输出没有问题。 – root1982 2012-04-18 19:37:18

2
  1. 您需要设置“mapred.compress.map.output”为真。
  2. 可选方案,您可以通过设置“mapred.map.output.compression.codec”选择你的压缩编解码器。注1:mapred输出压缩不应该是BLOCK。请参阅下面的JIRA查看详细: https://issues.apache.org/jira/browse/HADOOP-1194 NOTE2:GZIP和BZ2是CPU密集型的。如果网络速度较慢,而GZIP或BZ2可以提供更好的压缩比,则可以证明CPU周期花费的合理性。否则,请考虑LZO或Snappy编解码器。
    注3:如果你想使用地图输出压缩,考虑安装它通过JNI调用,为您提供更好的性能,原生编解码器。
+0

除此之外,我们是否可以压缩映射器值而不是密钥? – 2012-04-12 19:21:46

+0

这不是一个选项。 – root1982 2012-04-18 19:38:27

52

mapred.compress.map.output:是映射器和减速器之间数据的压缩。如果使用活泼的编解码器,这很可能会提高读写速度并降低网络开销。不要担心在这里吐痰。这些文件不存储在hdfs中。它们是仅存在于地图缩小作业中的临时文件。

mapred.map.output.compression.codec:我会用活泼的

mapred.output.compress:此布尔标志将定义是整个的map/reduce作业将输出压缩数据。我总是会把它设置为true。更快的读取/写入速度和更少的磁盘空间使用。

mapred.output.compression.type:我使用块。即使对于所有压缩格式(gzip,snappy和bzip2),这也会使压缩分裂,只要确保使用序列,RCFile或Avro等可分割文件格式即可。

mapred.output.compression.codec:这是map/reduce作业的压缩编解码器。我大多使用三种之一:Snappy(最快的r/w 2x-3x压缩),gzip(正常r快速w 5x-8x压缩),bzip2(慢速r/w 8x-12x压缩)

还记得什么时候压缩映射输出,因为拆分压缩会根据您的排序顺序而有所不同。像数据一样近,压缩效果越好。

+5

我如何知道地图输出是否真的被压缩?通过比较没有压缩和压缩的“映射输出字节”?我看到我的地图输出字节大约是91 GB。它是地图输出压缩的好候选者吗?一般来说,我将如何找到地图输出压缩的好候选者。 “地图输出字节”是一个很好的指标吗? – 2013-08-29 19:50:35

+1

hadoop 2. *版本现在使用mapreduce。*。*,请在 – fengyun 2014-05-19 08:56:11

+0

以下阅读我的回答。请您详细说明“即使对于所有压缩格式,他的压缩方式也会分裂”吗?根据我的经验,gz并不是真的可以分裂的。您将文件存储在多个块中,但当映射器读取它们时,每个文件只产生一个映射器。这意味着除了第一个块之外的所有块都通过网络获取 – markob 2017-03-04 07:23:35

1

如果您使用的MAPR的分布Hadoop的,你可以得到压缩的好处,不用所有的编解码器的胡闹。

MAPR在文件系统层级进行压缩,以使应用程序不需要知道或关心。可以在目录级别打开或关闭压缩,以便压缩输入,但不能输出或任何您喜欢的内容。一般来说,压缩速度非常快(默认情况下,它使用类似于snappy的算法),因此大多数应用程序在使用本机压缩时会看到性能提升。如果您的文件已经被压缩,那么检测速度非常快,并且压缩功能会自动关闭,因此您也不会在那里看到任何处罚。