Ich versuche, die Beziehung zwischen der Anzahl der Kerne und der Anzahl der Ausführenden zu verstehen, wenn ein Spark-Job auf YARN ausgeführt wird.
Die Testumgebung ist wie folgt:
- Anzahl der Datenknoten: 3
- Datenknoten-Maschinenspezifikation:
- CPU: Core i7-4790 (Anzahl der Kerne: 4, Anzahl der Threads: 8)
- RAM: 32 GB (8 GB x 4)
- Festplatte: 8 TB (2 TB x 4)
Netzwerk: 1 GB
Spark-Version: 1.0.0
Hadoop-Version: 2.4.0 (Hortonworks HDP 2.1)
Spark-Jobfluss: sc.textFile -> Filter -> Map -> Filter -> MapToPair -> ReduceByKey -> Map -> SaveAsTextFile
Eingabedaten
- Typ: einzelne Textdatei
- Größe: 165 GB
- Anzahl der Zeilen: 454.568.833
Ausgabe
- Anzahl der Zeilen nach dem zweiten Filter: 310.640.717
- Anzahl der Zeilen der Ergebnisdatei: 99.848.268
- Größe der Ergebnisdatei: 41 GB
Der Job wurde mit folgenden Konfigurationen ausgeführt:
--master yarn-client --executor-memory 19G --executor-cores 7 --num-executors 3
(Ausführende pro Datenknoten verwenden so viel wie Kerne)--master yarn-client --executor-memory 19G --executor-cores 4 --num-executors 3
(Anzahl der Kerne reduziert)--master yarn-client --executor-memory 4G --executor-cores 2 --num-executors 12
(weniger Kern, mehr Vollstrecker)
Verstrichene Zeiten:
50 min 15 sek
55 min 48 sek
31 min 23 sek
Zu meiner Überraschung war (3) viel schneller.
Ich dachte, dass (1) schneller sein würde, da es beim Mischen weniger Kommunikation zwischen Ausführenden geben würde.
Obwohl die Anzahl der Kerne von (1) kleiner als (3) ist, ist die Anzahl der Kerne nicht der Schlüsselfaktor, da 2) eine gute Leistung erbracht hat.
(Nach der Antwort von pwilmot wurden folgende hinzugefügt.)
Zur Information lautet die Bildschirmaufnahme des Leistungsmonitors wie folgt:
- Ganglia-Datenknotenübersicht für (1) - Job gestartet um 04:37.
- Ganglia-Datenknotenübersicht für (3) - Job gestartet um 19:47. Bitte ignorieren Sie die Grafik vor diesem Zeitpunkt.
Das Diagramm ist grob in zwei Abschnitte unterteilt:
- Erstens: von Anfang bis zur ReduzierungByKey: CPU-intensiv, keine Netzwerkaktivität
- Zweitens: Nach dem Reduzieren von ByKey: CPU wird die Netzwerk-E / A abgeschlossen.
Wie die Grafik zeigt, kann (1) so viel CPU-Leistung verbrauchen, wie angegeben wurde. Es könnte also nicht das Problem der Anzahl der Threads sein.
Wie kann man dieses Ergebnis erklären?