web-dev-qa-db-fra.com

Mode autonome Spark: comment compresser une sortie d'étincelle écrite sur HDFS

Relatif à mon autre question, mais distincte:

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

Si je sauvegarde un RDD sur HDFS, comment puis-je demander à spark de compresser la sortie avec gzip? Dans Hadoop, il est possible de définir

mapred.output.compress = true

et choisissez l'algorithme de compression avec

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

Comment pourrais-je faire cela en étincelle? Cela fonctionnera-t-il aussi?

edit : using spark-0.7.2

22
ptikobj

La méthode saveAsTextFile prend un paramètre facultatif supplémentaire de la classe de codec à utiliser. Donc, pour votre exemple, utiliser gzip devrait ressembler à ceci:

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

METTRE &AGRAVE; JOUR

Puisque vous utilisez 0.7.2, vous pourrez peut-être porter le code de compression via les options de configuration que vous avez définies au démarrage. Je ne sais pas si cela fonctionnera exactement, mais vous devez partir de cela:

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)

à quelque chose comme ça:

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

Si vous le faites fonctionner, publier votre configuration serait probablement utile pour les autres aussi.

21
Noah

Un autre moyen de sauvegarder les fichiers gzippés sur le système de répertoires HDFS ou Amazon S3 consiste à utiliser la méthode saveAsHadoopFile .

someMap est RDD [(K, V)]. Si vous avez someMap comme RDD [V], vous pouvez appeler someMap.map (line => (line, "")) pour utiliser la méthode saveAsHadoopFile.

import org.Apache.hadoop.io.compress.GzipCodec

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

Pour les nouvelles versions de Spark, procédez comme suit dans votre fichier spark-defaults.xml. (mapred est dérivé).

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