Spark Standalone Mode:如何压缩写入HDFS的spark输出

时间:2013-06-21 17:37:00

标签: scala compression hdfs apache-spark

与我的其他问题相关,但截然不同:

someMap.saveAsTextFile("hdfs://HOST:PORT/out")

如果我将RDD保存到HDFS,如何通过gzip告诉spark压缩输出? 在Hadoop中,可以设置

mapred.output.compress = true

并使用

选择压缩算法
mapred.output.compression.codec = <<classname of compression codec>>

我如何在火花中做到这一点?这也会起作用吗?

编辑:使用spark-0.7.2

4 个答案:

答案 0 :(得分:21)

方法saveAsTextFile使用要使用的编解码器类的附加可选参数。因此,对于您的示例,使用gzip应该是这样的:

someMap.saveAsTextFile("hdfs://HOST:PORT/out", classOf[GzipCodec])

<强>更新

由于您使用的是0.7.2,因此您可以通过在启动时设置的配置选项来移植压缩代码。我不确定这是否可以正常工作,但你需要从这里开始:

conf.setCompressMapOutput(true)
conf.set("mapred.output.compress", "true")
conf.setMapOutputCompressorClass(c)
conf.set("mapred.output.compression.codec", c.getCanonicalName)
conf.set("mapred.output.compression.type", CompressionType.BLOCK.toString)

这样的事情:

System.setProperty("spark.hadoop.mapred.output.compress", "true")
System.setProperty("spark.hadoop.mapred.output.compression.codec", "true")
System.setProperty("spark.hadoop.mapred.output.compression.codec", "org.apache.hadoop.io.compress.GzipCodec")
System.setProperty("spark.hadoop.mapred.output.compression.type", "BLOCK")

如果你让它发挥作用,发布你的配置可能对其他人也有帮助。

答案 1 :(得分:2)

将gzip压缩文件保存到HDFS或Amazon S3目录系统的另一种方法是使用 saveAsHadoopFile 方法。

someMap是RDD [(K,V)],如果你有一些Map作为RDD [V],你可以调用someMap.map(line =&gt;(line,“”)来使用saveAsHadoopFile方法。

import org.apache.hadoop.io.compress.GzipCodec

someMap.saveAsHadoopFile(output_folder_path, classOf[String], classOf[String], classOf[MultipleTextOutputFormat[String, String]], classOf[GzipCodec])

答案 2 :(得分:1)

对于较新的Spark版本,请在spark-defaults.xml文件中执行以下操作。 (mapred已退出)。

<property>
    <name>mapreduce.output.fileoutputformat.compress</name>
    <value>true</value>
</property>
<property>
    <name>mapreduce.output.fileoutputformat.compress.codec</name>
    <value>GzipCodec</value>
</property>
<property>
    <name>mapreduce.output.fileoutputformat.compress.type</name>
    <value>BLOCK</value>
</property>

答案 3 :(得分:1)

这是对大多数所有火花版本进行快速压缩的最简单/最短方法。

import org.apache.hadoop.io.SequenceFile.CompressionType

 /**
   * Set compression configurations to Hadoop `Configuration`.
   * `codec` should be a full class path
   */
  def setCodecConfiguration(conf: Configuration, codec: String): Unit = {
    if (codec != null) {
      conf.set("mapreduce.output.fileoutputformat.compress", "true")
      conf.set("mapreduce.output.fileoutputformat.compress.type", CompressionType.BLOCK.toString) // "BLOCK" as string
      conf.set("mapreduce.output.fileoutputformat.compress.codec", codec)
      conf.set("mapreduce.map.output.compress", "true")
      conf.set("mapreduce.map.output.compress.codec", codec)
    } else {
      // This infers the option `compression` is set to `uncompressed` or `none`.
      conf.set("mapreduce.output.fileoutputformat.compress", "false")
      conf.set("mapreduce.map.output.compress", "false")
    }
  }

其中confspark.sparkContext.hadoopConfiguration

codec上面方法中的字符串参数选项是

 1.none 
 2.uncompressed 
 3.bzip2 
 4.deflate 
 5.gzip 
 6.lz4 
 7.snappy