2014-09-22 5 views
6

Ich schrieb ein Spark-Programm, das die Funktionalität eines vorhandenen Map Reduce-Jobs nachahmt. Der MR-Job dauert etwa 50 Minuten pro Tag, aber der Spark-Job dauerte nur 9 Minuten! Das ist großartig!Spark: Schnitt Nr. der Ausgabedateien

Als ich das Ausgabeverzeichnis anschaute, bemerkte ich, dass es 1.020 Teildateien erstellte. Der MR-Job verwendet nur 20 Reduzierungen, so dass nur 20 Dateien erstellt werden. Wir müssen die Anzahl der Ausgabedateien reduzieren. ansonsten wäre unser Namespace in kürzester Zeit voll.

Ich versuche herauszufinden, wie ich die Anzahl der Ausgabedateien unter Spark reduzieren kann. Scheint wie 1.020 Aufgaben ausgelöst werden und jeder erstellt eine Teildatei. Ist das richtig? Muss ich das Niveau der Parallelität ändern, um Nr. Zu verringern. von Aufgaben, wodurch Nr. reduziert wird. von Ausgabedateien? Wenn ja, wie stelle ich es ein? Ich habe Angst, nein zu schneiden. von Aufgaben wird diesen Prozess verlangsamen - aber ich kann das testen!

Antwort

9

Reduzieren Sie die Anzahl der reduzieren Aufgaben werden den Prozess sicher verlangsamen. Allerdings sollte es immer noch erheblich schneller sein als HadoopMapReduce für Ihren Anwendungsfall.

Meiner Meinung nach ist die beste Methode, um die Anzahl der Ausgabedateien zu begrenzen, die coalesce(numPartitions) Umwandlung. Unten ist ein Beispiel:

JavaSparkContext ctx = new JavaSparkContext(/*your configuration*/); 

JavaRDD<String> myData = ctx.textFile("path/to/my/file.txt"); 

//Consider we have 1020 partitions and thus 1020 map tasks 
JavaRDD<String> mappedData = myData.map(your map function); 

//Consider we need 20 output files 
JavaRDD<String> newData = mappedData.coalesce(20) 
newData.saveAsTextFile("output path"); 

In diesem Beispiel würde die Kartenfunktion von 1020 Aufgaben ausgeführt werden, die in irgendeiner Weise verändert würden nicht werden. Nach dem Zusammenführen der Partitionen sollten jedoch nur 20 Partitionen vorhanden sein. In diesem Fall würden 20 Ausgabedateien am Ende des Programms gespeichert werden.

Wie bereits erwähnt, ist zu beachten, dass diese Methode langsamer ist als 1020 Ausgabedateien. Die Daten müssen in wenigen Partitionen (von 1020 bis 20) gespeichert werden.

Hinweis: Bitte beachten Sie auch die repartition Befehl auf der folgenden link zu.

+0

Vielen Dank Mikel. Es hat sehr gut funktioniert. Habe auch etwas schlechten Code auf meiner Seite entfernt, so dass es jetzt sogar noch schneller läuft. Gesamtzeit: 5 Minuten! Apache Spark ROCKS! – DilTeam

+0

Ich bin froh, dass es funktioniert hat. Wenn diese Antwort die Lösung für Ihr Problem ist, überprüfen Sie sie bitte als endgültige Antwort, um die Frage zu schließen. –

+0

Ich habe einen Blick auf andere Ihrer Fragen geworfen und niemand wurde als beantwortet markiert, obwohl sie tatsächlich gelöst wurden. Bitte aktualisieren Sie Ihre Fragen und markieren Sie die Antworten (auch wenn sie von Ihnen gegeben wurden). –