Spark auf localhost

8

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?

    
guilhermecgs 03.11.2016, 20:59
quelle

3 Antworten

2

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:

  1. Versuchen Sie es mit reduceByKey , die schneller sein soll (weitere Informationen auch im oben Vermeiden GroupByKey Link enthalten ist).
  2. Verwenden Sie Datenrahmen (statt RDDs) als Verschlechterungsfaktoren umfassen Performance-Optimierungen (und die DF GroupBy-Anweisung ist schneller als die RDD-Version). Wenn Sie Python verwenden, können Sie die Python-zu-JVM-Probleme mit PySpark RDDs vermeiden. Weitere Informationen dazu finden Sie in PySpark Internals zu sehen

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!

    
Denny Lee 13.11.2016, 15:29
quelle
1

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:

%Vor%

Wenn ich Recht habe, müssen Sie die Datenbank optimieren. Es kann sein:

  1. Netzwerkproblem (langsames Netzwerk zum DB-Server)
  2. Komplizierte (und langsame) SQL in dieser Datenbank (versuchen Sie es mit der Postgre-Shell)
  3. Einige Autorisierungsschwierigkeiten auf dem DB Server
  4. Problem mit dem JDBC-Treiber, den Sie verwenden
Mariusz 11.11.2016 20:56
quelle
0

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.

    
user7005835 03.11.2016 22:58
quelle

Tags und Links