我有一个map-reduce java程序,我尝试只压缩映射器输出但不压缩reducer输出。我认为这可以通过在Configuration实例中设置以下属性来实现,如下所示。但是,当我运行我的作业时,reducer生成的输出仍然被压缩,因为生成的文件是:part-r-00000.gz。有没有人成功地压缩了映射器数据而不是缩减器?这甚至可能吗?
//压缩映射器输出
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);
答案 0 :(得分:54)
mapred.compress.map.output :是mapper和reducer之间的数据压缩。如果使用snappy编解码器,这很可能会提高读写速度并降低网络开销。不要担心随地吐痰。这些文件不存储在hdfs中。它们是仅存在于map reduce作业的临时文件。
mapred.map.output.compression.codec :我会用snappy
mapred.output.compress :这个布尔标志将定义是整个map / reduce作业将输出压缩数据。我也总是把它设置为真。更快的读/写速度和更少的磁盘间隔。
mapred.output.compression.type :我使用了阻止。即使对于所有压缩格式(gzip,snappy和bzip2),这也会使压缩可分割,只需确保使用可拆分文件格式,如sequence,RCFile或Avro。
mapred.output.compression.codec :这是map / reduce作业的压缩编解码器。我主要使用以下三种中的一种:Snappy(最快的r / w 2x-3x压缩),gzip(正常r快速w 5x-8x压缩),bzip2(慢速r / w 8x-12x压缩)
还要记住压缩映射输出时,因为拆分压缩会因排序顺序而异。像数据一样接近,压缩效果越好。
答案 1 :(得分:21)
使用MR2,现在我们应该设置
conf.set("mapreduce.map.output.compress", true)
conf.set("mapreduce.output.fileoutputformat.compress", false)
答案 2 :(得分:12)
“输出压缩”将压缩您的最终输出。要仅压缩地图输出,请使用以下内容:
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");
答案 3 :(得分:2)
答案 4 :(得分:1)
如果您使用MapR的Hadoop发行版,您可以获得压缩的好处,而不需要使用编解码器的所有文件夹。
MapR在文件系统级别本地压缩,以便应用程序不需要知道或关心。压缩可以在目录级别打开或关闭,因此您可以压缩输入,但不能输出或任何您喜欢的输出。通常,压缩速度非常快(默认情况下使用类似于snappy的算法),大多数应用程序在使用本机压缩时都会看到性能提升。如果你的文件已经被压缩,那么很快就会被检测到并且压缩会自动关闭,所以你不会在那里看到惩罚。