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