与我的其他问题相关,但截然不同:
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
答案 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")
}
}
其中conf
是spark.sparkContext.hadoopConfiguration
codec
上面方法中的字符串参数选项是
1.none 2.uncompressed 3.bzip2 4.deflate 5.gzip 6.lz4 7.snappy