2013-06-21 34 views
22

與我的其他問題,但不同的:星火單機模式:如何壓縮火花輸出寫入HDFS

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

如果我保存RDD到HDFS,我怎麼能告訴火花壓縮用gzip輸出? 在Hadoop中,可以設置

mapred.output.compress = true 

,並選擇與

mapred.output.compression.codec = <<classname of compression codec>> 

我將如何做到這一點火花的壓縮算法?這也會起作用嗎?

編輯:使用火花0.7.2

回答

20

saveAsTextFile需要編解碼器類使用的附加的可選參數的方法。因此,對於你的例子應該是這樣的,以用gzip:

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

UPDATE

由於您使用的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") 

如果你得到它的工作,發佈您的配置可能會對別人也有幫助。

+0

與火花的版本工作的呢?我使用的火花0.7。 2,我在編譯時得到一個錯誤:'錯誤:saveAsTextFile方法的參數太多了。我看到這是[討論](https://github.com/mesos/spark/pull/645)。 – ptikobj

+1

我看到它是最新的spark-0.8.0。將不得不按照它看起來,因爲這是一個相當重要的功能。 – ptikobj

+0

啊,這很有道理。我一直在使用主分支,而不是0.7.2。 – Noah

2

另一種將gzip文件保存到HDFS或Amazon S3目錄系統的方法是使用saveAsHadoopFile方法。

someMap是RDD [(K,V)],如果有someMap作爲RDD [V],則可以調用someMap.map(線=>(行, 「」)使用saveAsHadoopFile方法。

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

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

是否可以在'spark-defaults.xml'中以類似的方式設置參數,所以每個作業都可以使用它?我試着將設置複製到'spark-defaults.xml'中,但設置似乎沒有被拾取。 – nikk

1

對於較新的Spark版本,請不要在你的火花defaults.xml中文件的以下(mapred是derecated)。

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