Scala Spark独立模式:如何压缩写入HDFS的Spark输出

Scala Spark独立模式:如何压缩写入HDFS的Spark输出,scala,compression,hdfs,apache-spark,Scala,Compression,Hdfs,Apache Spark,与我的另一个问题相关,但不同: someMap.saveAsTextFile("hdfs://HOST:PORT/out") 如果我将RDD保存到HDFS,我如何告诉spark使用gzip压缩输出? 在Hadoop中,可以设置 mapred.output.compress = true 并选择了与之相匹配的压缩算法 mapred.output.compression.codec = <<classname of compression codec>> mapred.

与我的另一个问题相关,但不同:

someMap.saveAsTextFile("hdfs://HOST:PORT/out")
如果我将RDD保存到HDFS,我如何告诉spark使用gzip压缩输出? 在Hadoop中,可以设置

mapred.output.compress = true
并选择了与之相匹配的压缩算法

mapred.output.compression.codec = <<classname of compression codec>>
mapred.output.compression.codec=
在spark里我该怎么做?这也行吗


edit:使用spark-0.7.2

方法
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")

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

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

someMap是RDD[(K,V)],如果将someMap作为RDD[V],则可以调用someMap.map(line=>(line,”)来使用saveAsHadoopFile方法

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

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

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


mapreduce.output.fileoutputformat.compress
真的
mapreduce.output.fileoutputformat.compress.codec
GzipCodec
mapreduce.output.fileoutputformat.compress.type
块
这是对所有版本的spark快速压缩的最简单/最短方法。

其中
conf
spark.sparkContext.hadoopConfiguration

codec
上述方法中的字符串参数选项为


spark的哪个版本能起作用?我正在使用spark-0.7.2,我在编译时遇到一个错误:
错误:方法saveAsTextFile的参数太多了。
。我看到了这一点。我看到它是在最新的spark-0.8.0中。将不得不按看起来的那样拉它,因为这是一个相当重要的功能。啊,这很有意义。我一直在工作我已经测试了您的第二个代码片段(
System.setProperty(…)[…]
),它立即在0.7.2上运行。谢谢:)@noah您正在设置
spark.hadoop.mapred.output.compression.codec
两次,这是多余的,除非我遗漏了什么?是否可以在
spark defaults.xml
中以类似的方式设置这些参数,以便每个作业都可以使用它?我尝试将设置复制到
spark defaults.xml
中,但设置似乎没有被拾取。
<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>
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")
    }
  }
 1.none 
 2.uncompressed 
 3.bzip2 
 4.deflate 
 5.gzip 
 6.lz4 
 7.snappy