Ich führe eine Spark-Anwendung mit dem YARN-Client- oder YARN-Cluster-Modus aus.
Aber es scheint zu lange zu brauchen, um zu starten.
Es dauert 10+ Sekunden, um den Funkenkontext zu initialisieren.
Ist das normal? Oder kann es optimiert werden?
Die Umgebung ist wie folgt:
Der folgende Abschnitt ist der Startabschnitt des Anwendungsprotokolls. (Einige private Informationen wurden bearbeitet)
'Main: Initializing context' in der ersten Zeile und 'MainProcessor: Löschen vorheriger Ausgabedateien' in der letzten Zeile sind die Protokolle der Anwendung. Andere dazwischen sind von Spark selbst. Anwendungslogik wird ausgeführt, nachdem dieses Protokoll angezeigt wird.
%Vor%Danke.
AKTUALISIEREN
Ich denke, ich habe den (vielleicht teilweise, aber wichtigen) Grund gefunden.
Es liegt zwischen den folgenden Zeilen:
%Vor%Wenn ich die Protokolle auf der Cluster-Seite lese, wurden die folgenden Zeilen gefunden: (Die genaue Zeit unterscheidet sich von der obigen Zeile, aber es ist der Unterschied zwischen den Maschinen)
%Vor%Es scheint, dass Spark absichtlich 5 Sekunden schläft.
Ich habe den Spark-Quellcode gelesen, und in org.apache.spark.deploy.yarn.ApplicationMaster.scala hatte launchReporterThread () den Code dafür. Es ruft den allocator.allocateResources () und Thread.sleep () auf. Für den Schlaf liest es die Konfigurationsvariable spark.yarn.scheduler.heartbeat.interval-ms (der Standardwert ist 5000, was 5 Sekunden ist). Laut dem Kommentar "wollen wir vernünftig reagieren, ohne zu viele Anfragen an RM zu senden". Wenn also YARN die Zuteilungsanforderung nicht sofort erfüllt, werden 5 Sekunden verschwendet.
Wenn ich die Konfigurationsvariable auf 1000 änderte, wurde nur 1 Sekunde gewartet.
Hier sind die Protokollzeilen nach der Änderung:
%Vor%4 Sekunden gespeichert.
Wenn man also nicht 5 Sekunden warten möchte, kann man die spark.yarn.scheduler.heartbeat.interval-ms ändern.
Ich hoffe, dass der zusätzliche Aufwand, den es verursacht, vernachlässigbar wäre.
AKTUALISIEREN
Ein verwandtes JIRA-Problem wurde geöffnet und behoben. Siehe Ссылка
Das ist ziemlich typisch. Mein System benötigt etwa 20 Sekunden von der Ausführung der Spark-Submission bis zum Erhalt eines SparkContext.
Wie es in den Dokumenten an einigen Stellen heißt, besteht die Lösung darin, Ihren Treiber in einen RPC-Server zu verwandeln. Auf diese Weise initialisieren Sie einmal und andere Anwendungen können dann den Kontext des Treibers als Dienst verwenden.
Ich mache das gerade mit meiner Bewerbung. Ich benutze http4s und verwandle meinen Treiber in einen Webserver.
Wenn Sie Mac OS verwenden, um einige Aufgaben im eigenständigen Modus auszuführen,
Denken Sie daran, remote ssh connection
in Ihrem system preference -> sharing
zu aktivieren (ich weiß nicht, warum wir das tun sollten)
Vor der Aktivierung dauert es ca. 1 Minute, um spark-submit xx.py
Nach der Aktivierung dauert es nur 3 Sekunden, um es auszuführen.
Ich hoffe, es kann anderen helfen, Probleme auf der Mac OS-Plattform zu haben.
Tags und Links hadoop apache-spark yarn