Comment puis-je fusionner étincelle fichiers de résultats sans repartitionner et copyMerge?
J'utilise le code suivant:
csv.saveAsTextFile(pathToResults, classOf[GzipCodec])
pathToResults répertoire a beaucoup de fichiers, comme partie-0000, partie-0001 etc.
Je peux utiliser FileUtil.copyMerge(), mais c'est vraiment lent, c'est de téléchargement de tous les fichiers de pilote de programme et puis les charger dans hadoop. Mais FileUtil.copyMerge() plus rapide que:
csv.repartition(1).saveAsTextFile(pathToResults, classOf[GzipCodec])
Comment puis-je fusionner étincelle fichiers de résultats sans repartitionner et FileUtil.copyMerge()?
OriginalL'auteur Leonard | 2015-03-13
Vous devez vous connecter pour publier un commentaire.
Malheureusement, il n'y a pas d'autre option pour obtenir un fichier de sortie unique dans Spark. Au lieu de
repartition(1)
vous pouvez utilisercoalesce(1)
, mais avec le paramètre1
leur comportement serait le même. Étincelle de recueillir vos données dans une seule partition en mémoire, ce qui pourrait provoquer des OOM erreur si vos données est trop grande.Une autre option pour fusionner des fichiers sur HDFS peut-être d'écrire un simple travail de MapReduce (ou travail de Cochon, ou Hadoop Streaming de travail), qui serait l'ensemble du répertoire en entrée et en utilisant un seul réducteur de générer un fichier de sortie unique. Mais sachez qu'avec le MapReduce approche de toutes les données seraient d'abord copié dans le réducteur de système de fichiers local qui peut causer de "out of space" erreur.
Voici quelques liens utiles sur le même sujet:
OriginalL'auteur 0x0FFF
Eu exactement la même question et a dû écrire pySpark code (avec les appels à Hadoop API) qui implémente copyMerge:
https://github.com/Tagar/stuff/blob/master/copyMerge.py
Malheureusement copyMerge autonome, Hadoop appel d'API va être obsolète et retiré dans Hadoop 3.0. Si cette mise en œuvre ne dépend pas de Hadoop est copyMerge (il re-met en œuvre).
OriginalL'auteur Tagar