Wie kann ich merge spark-Ergebnis-Dateien ohne neu partitionieren und copyMerge?
Verwende ich folgenden code:
csv.saveAsTextFile(pathToResults, classOf[GzipCodec])
pathToResults Verzeichnis viele Dateien hat, wie Teil-0000, Teil-0001 usw.
Die ich verwenden kann, FileUtil.copyMerge(), aber es ist wirklich langsam ist, ist es alle Dateien herunterladen, auf Fahrer-Programm und dann laden Sie Sie in hadoop. Aber FileUtil.copyMerge() schneller als:
csv.repartition(1).saveAsTextFile(pathToResults, classOf[GzipCodec])
Wie kann ich merge spark-Ergebnis-Dateien ohne neu partitionieren und FileUtil.copyMerge()?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Leider gibt es keine andere option, um einen einzigen Ausgabe-Datei in Spark. Statt
repartition(1)
können Siecoalesce(1)
, aber mit parameter1
Ihr Verhalten wäre der gleiche. Funken sammeln würde, Ihre Daten in einer einzigen partition im Speicher, die möglicherweise dazu führen, OOM Fehler, wenn die Daten zu groß.Weitere option für das Zusammenführen von Dateien in HDFS könnte sein, schreiben einen einfachen MapReduce-job (Schwein oder job, oder Hadoop-Streaming-Auftrag), dass würde das ganze Verzeichnis als Eingang und mit einem einzigen reducer generieren Sie eine einzelne Ausgabe-Datei. Aber bewusst sein, dass mit dem MapReduce-Ansatz, die Daten zunächst kopiert reducer lokalen Dateisystem, die möglicherweise dazu führen, "out of space" - Fehler.
Hier werden einige nützliche links zum gleichen Thema:
Hatte genau die gleiche Frage und hatte zu schreiben pySpark code (mit aufrufen an die Hadoop-API) implementiert, mit der copyMerge:
https://github.com/Tagar/stuff/blob/master/copyMerge.py
Leider copyMerge als standalone-Hadoop-API-Aufruf wird als veraltet markiert und entfernt in Hadoop 3.0. Damit diese Umsetzung hängt nicht von Hadoop ist copyMerge (re-implementiert).
coalesce(1) ist die Arbeit einwandfrei. Ich sehe auch hadoop-streaming-option, die Zusammenführen können HDFS-Dateien on-the-fly, wenn Sie möchten, um dieses Skript auszuführen: