Compression Hadoop,如何压缩映射器输出而不是还原器输出

Compression Hadoop,如何压缩映射器输出而不是还原器输出,compression,hadoop,hdfs,Compression,Hadoop,Hdfs,我有一个map reduce java程序,其中我尝试只压缩映射器输出,而不压缩reducer输出。我认为这可以通过在配置实例中设置以下属性来实现,如下所示。但是,当我运行作业时,reducer生成的输出仍然是压缩的,因为生成的文件是:part-r-00000.gz。是否有人成功地压缩了映射器数据,但没有压缩还原器?这可能吗 //压缩映射器输出 conf.setBoolean("mapred.output.compress", true); conf.set("mapred.output.com

我有一个map reduce java程序,其中我尝试只压缩映射器输出,而不压缩reducer输出。我认为这可以通过在配置实例中设置以下属性来实现,如下所示。但是,当我运行作业时,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);
“输出压缩”将压缩最终输出。要仅压缩贴图输出,请使用以下内容:

  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"); 
  • 您需要将“mapred.compress.map.output”设置为true
  • 或者,您可以通过设置“mapred.map.output.compression.codec”来选择压缩编解码器。 注1:映射输出压缩不应被阻塞。有关详细信息,请参见以下JIRA: 注2:GZIP和BZ2是CPU密集型的。如果您的网络速度较慢,并且GZIP或BZ2提供了更好的压缩比,则可以证明CPU周期的花费是合理的。否则,考虑LZO或快照编解码器。 注3:如果您想使用MAP输出压缩,请考虑安装通过JNI调用的本机编解码器,并为您提供更好的性能。李>
    mapred.compress.map.output:是映射程序和还原程序之间的数据压缩。如果您使用snappy编解码器,这很可能会提高读写速度并减少网络开销。别担心在这里吐痰。这些文件不存储在hdfs中。它们是仅为map reduce作业而存在的临时文件

    mapred.map.output.compression.codec:我会使用snappy

    映射red.output.compress:此布尔标志将定义整个映射/reduce作业将输出压缩数据。我总是把这也设置为真。更快的读/写速度和更少的磁盘空间

    mapred.output.compression.type:我使用块。这将使压缩即使对于所有压缩格式(gzip、snappy和bzip2)也是可拆分的,只需确保使用可拆分的文件格式,如sequence、RCFile或Avro

    mapred.output.compression.codec:这是映射/减少作业的压缩编解码器。我主要使用三种方法中的一种:Snappy(最快的r/w 2x-3x压缩)、gzip(正常的r快速w 5x-8x压缩)、bzip2(慢速r/w 8x-12x压缩)


    还请记住,当压缩映射输出时,由于拆分,压缩将根据您的排序顺序而有所不同。相似的数据集中在一起,压缩效果越好。

    如果您使用MapR的Hadoop发行版,您可以在不使用编解码器的所有folderol的情况下获得压缩的好处


    MapR在文件系统级别进行本机压缩,因此应用程序不需要知道或关心。压缩可以在目录级别打开或关闭,因此您可以压缩输入,但不能压缩输出或任何您喜欢的内容。通常,压缩速度非常快(默认情况下使用类似于snappy的算法),因此大多数应用程序在使用本机压缩时都会看到性能提升。如果您的文件已被压缩,则会很快检测到压缩,并自动关闭压缩,这样您也不会看到有任何损失。

    对于MR2,现在我们应该设置

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

    有关更多详细信息,请参阅:

    使用gzip作为压缩器不是一个好主意。主要问题是它不可拆分。为什么?我认为mapper的输出不会被分割,只有当使用reducer或identity reducer时,输出才会被分割。我的理解是使用GZIP压缩输入数据不是一个好主意。原因是它是不可拆分的。使用gzip进行地图输出没有问题。gzip只是比LZO和Snappy等其他算法慢一点,但使用gzip确实可以获得更好的压缩效果。值得一提的是,AWS的EMR默认为Snappy。更进一步,我们可以只压缩映射器值而不是键吗?我怎么知道映射输出是否被压缩了?通过比较无压缩和有压缩的“映射输出字节”?我看到我的映射输出字节约为91 GB。它是地图输出压缩的好候选者吗?通常,我如何找到映射输出压缩的好候选对象。“映射输出字节”是一个很好的指标吗?hadoop 2.*版本现在使用mapreduce.*.*,请阅读下面我的答案。您能否详细说明“his将使压缩可拆分,即使是所有压缩格式”?根据我的经验,gz并不是真正可拆分的。您可以跨多个块存储文件,但当映射程序读取这些文件时,每个文件只生成一个映射程序。这意味着除第一个块外的所有块都通过网络获取。如果有人对avro的工作方式感兴趣,因为avro只支持snappy和deflate,此配置是最好的。最终缩减的文件名不会更改,但是您会发现,由于内部块级别的压缩,文件大小会发生更改。此处的更多详细信息:在向EMR添加步骤时是否设置了这些设置?