【问题标题】:Hadoop, how to compress mapper output but not the reducer outputHadoop,如何压缩映射器输出而不是减速器输出
【发布时间】:2017-05-13 08:30:44
【问题描述】:

我有一个 map-reduce java 程序,我在其中尝试只压缩 mapper 输出而不压缩 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);

【问题讨论】:

    标签: compression hadoop hdfs


    【解决方案1】:

    ma​​pred.compress.map.output:是mapper和reducer之间的数据压缩。如果您使用 snappy 编解码器,这很可能会提高读写速度并减少网络开销。不用担心在这里吐痰。这些文件不存储在 hdfs 中。它们是仅为 map reduce 作业而存在的临时文件。

    ma​​pred.map.output.compression.codec:我会使用 snappy

    ma​​pred.output.compress:这个布尔标志将定义整个 map/reduce 作业将输出压缩数据。我也总是将其设置为 true。更快的读/写速度和更少的磁盘空间使用。

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

    ma​​pred.output.compression.codec:这是 map/reduce 作业的压缩编解码器。我主要使用以下三种中的一种:Snappy(最快的 r/w 2x-3x 压缩)、gzip(普通 r 快速 w 5x-8x 压缩)、bzip2(慢速 r/w 8x-12x 压缩)

    还请记住,当压缩映射输出时,由于拆分压缩会根据您的排序顺序而有所不同。数据越接近,压缩效果越好。

    【讨论】:

    • 我如何知道地图输出是否真的被压缩了?通过比较没有压缩和压缩的“映射输出字节”?我看到我的地图输出字节约为 91 GB。它是地图输出压缩的好选择吗?一般来说,我将如何找到适合地图输出压缩的候选者。 “地图输出字节”是一个很好的指标吗?
    • hadoop 2.* 版本现在使用 mapreduce.*.*,请阅读下面的答案
    • 您能否详细说明“即使对于所有压缩格式,他也会使压缩可拆分”?根据我的经验, gz 并不是真正可拆分的。您将文件存储在多个块中,但是当映射器读取它们时,每个文件仅生成 1 个映射器。这意味着除了第一个块之外的所有块都通过网络获取
    【解决方案2】:

    有了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

    【讨论】:

    • 如果有人对这对 avro 的工作方式感兴趣,因为 avro 只支持 snappy 和 deflate,所以这个配置是最好的。最终缩减的文件名不会改变,但是您会观察到文件大小会由于内部块级别的压缩而发生变化。更多细节在这里:quora.com/Can-avro-data-files-be-lzop-compressed-in-Hadoop
    • 您是否在向 EMR 添加步骤时设置这些设置?
    【解决方案3】:

    “输出压缩”将压缩您的最终输出。要仅压缩地图输出,请使用以下内容:

      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"); 
    

    【讨论】:

    • 使用 gzip 作为压缩器并不是一个好主意。主要问题是它不可拆分。
    • 为什么?我认为 mapper 的输出不会被拆分,只有在使用 reducer 或 identity reducer 时,输出才会被拆分。
    • 我的理解是使用GZIP压缩输入数据不是一个好主意。原因是它不可拆分。使用gzip输出地图没有问题。
    • Gzip 只是比 LZO 和 Snappy 等其他算法慢一点,但使用 Gzip 确实可以获得更好的压缩效果。值得一提的是,AWS 的 EMR 默认为 Snappy
    【解决方案4】:
    1. 您需要将“mapred.compress.map.output”设置为 true。
    2. 您可以选择通过设置“mapred.map.output.compression.codec”来选择您的压缩编解码器。 注意 1:mapred 输出压缩不应该是 BLOCK。有关详细信息,请参阅以下 JIRA: https://issues.apache.org/jira/browse/HADOOP-1194 注意 2:GZIP 和 BZ2 是 CPU 密集型的。如果您的网络速度较慢并且 GZIP 或 BZ2 提供更好的压缩比,则可能证明 CPU 周期的花费是合理的。否则,请考虑 LZO 或 Snappy 编解码器。
      注意 3:如果您想使用地图输出压缩,请考虑安装通过 JNI 调用的本机编解码器,并为您提供更好的性能。

    【讨论】:

    • 更进一步,我们可以只压缩映射器值而不压缩键吗?
    【解决方案5】:

    如果您使用 MapR 的 Hadoop 发行版,则无需使用编解码器的所有文件夹即可获得压缩的好处。

    MapR 在文件系统级别本地压缩,因此应用程序不需要知道或关心。压缩可以在目录级别打开或关闭,因此您可以压缩输入,但不能压缩输出或任何您喜欢的。通常,压缩非常快(默认情况下它使用类似于 snappy 的算法),以至于大多数应用程序在使用本机压缩时都会看到性能提升。如果您的文件已经被压缩,那么很快就会被检测到,并且会自动关闭压缩,因此您也不会看到任何惩罚。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-13
      • 1970-01-01
      • 2017-02-26
      相关资源
      最近更新 更多