Für Testzwecke, während ich kein Produktionscluster habe, benutze ich lokal spark:
%Vor%Außerdem verwende ich einen sehr sehr kleinen Datensatz, bestehend aus nur 20 Zeilen in einer Postgresql-Datenbank (~ 2kb)
Auch (!) ist mein Code ziemlich einfach, nur 20 Zeilen durch einen Schlüssel gruppieren und eine triviale Kartenoperation anwenden
%Vor%Was mich stört ist, dass die gesamte Ausführung ungefähr <5 Minuten dauert !!
Wenn ich die Spark-Benutzeroberfläche überprüfe, sehe ich, dass die meiste Zeit in Phase 6 verbracht wurde: byKey-Methode. (Stage 7, collect () -Methode war auch langsam ...)
Einige Informationen:
Diese Zahlen ergeben für mich keinen Sinn ... Warum brauche ich 22 Aufgaben, die 54 Sekunden lang ausgeführt werden, um weniger als 1 kb Daten zu verarbeiten
Kann es ein Netzwerkproblem sein, wenn Sie versuchen, die IP-Adresse von localhost herauszufinden? Ich weiß nicht ... Irgendwelche Hinweise?
Der Hauptgrund für die langsamere Leistung in Ihrem Code-Snippet scheint in der Verwendung von groupByKey()
zu liegen. Das Problem mit groupByKey
ist, dass es am Ende alle der Schlüsselwertpaar Shuffling in einer Menge von Daten entstehen unnötig übertragen wird. Eine gute Referenz, dieses Problem zu erklären, ist href="https://databricks.gitbooks.io/databricks-spark-knowledge-base/content/best_practices/prefer_reducebykey_over_groupbykey.html"> zu vermeiden.
Um dieses Problem zu umgehen, können Sie:
reduceByKey
, die schneller sein soll (weitere Informationen auch im oben Vermeiden GroupByKey Link enthalten ist). Durch die Art und Weise, die Überprüfung des Spark-UI Diagramm oben, die # 22 bezieht sich auf die Aufgabe # innerhalb der DAG (nicht die Anzahl der Aufgaben ausgeführt).
HTH!
Ich nehme an, das "postgresql" ist der Schlüssel, um dieses Rätsel zu lösen.
keyBy
ist wahrscheinlich die erste Operation, die die Daten wirklich verwendet, daher ist die Ausführungszeit größer, da sie die Daten von einer externen Datenbank erhalten muss. Sie können es überprüfen, indem Sie am Anfang hinzufügen:
Wenn ich Recht habe, müssen Sie die Datenbank optimieren. Es kann sein:
Von dem, was ich in meinem System gesehen habe, während Funke läuft:
Wenn wir einen Spark-Job ausführen, erstellt er intern Aufgaben und reduziert Aufgaben und führt sie aus. In Ihrem Fall wurden 22 solcher Aufgaben erstellt, um die Daten auszuführen, die Sie haben. Ich vergrößere die Größe der Daten, die Zahl kann groß sein.
Hoffe, das hilft.
Tags und Links apache-spark pyspark