2016-06-13 4 views
5

TL; DRFunken zeigen unterschiedliche Anzahl von Kernen als das, was passiert ist, es mit Funken einreichen

Spark-UI zeigt unterschiedliche Anzahl der Kerne und Speicher als das, was ich bin gefragt bei der Verwendung von Funken einreichen

mehr Details:

Ich habe Spark 1.6 im Standalone-Modus ausgeführt. Wenn ich Spark-Submit laufen lasse, gebe ich 1 Executor-Instanz mit 1 Core für den Executor und 1 Core für den Treiber. Was ich erwarten würde ist, dass meine Anwendung mit 2 Kernen insgesamt ausgeführt wird. Wenn ich die Registerkarte "Umgebung" auf der Benutzeroberfläche überprüfe, sehe ich, dass sie die korrekten Parameter erhalten hat, die ich ihr gegeben habe, aber es scheint immer noch so zu sein, als würde sie eine andere Anzahl von Kernen verwenden. Sie können es hier sehen:

enter image description here

Das ist mein Funken defaults.conf, die ich verwende:

spark.executor.memory 5g 
spark.executor.cores 1 
spark.executor.instances 1 
spark.driver.cores 1 

die Registerkarte Umgebung auf der Spark-UI Überprüfung zeigt, dass diese sind in der Tat die Empfangene Parameter, aber die Benutzeroberfläche zeigt immer noch etwas anderes

Hat jemand eine Idee, was dazu führen könnte, dass Spark eine andere Anzahl von Kernen verwendet, als ich es möchte? Ich versuchte offensichtlich es googeln, aber nicht etwas Nützliches zu diesem Thema

Vielen Dank im Voraus

+0

Wie läuft Spark? Im Cluster- oder Client-Modus? Mit YARN (basierend auf der Verwendung von executor.instances ..)? –

+0

Standalone (es ist am Anfang der Frage), nicht YARN, dachte ich über das Hinzufügen der Spark-Submit-Linie, aber es ist nur der Master und die Hauptklasse, der Rest ist durch die Spark-defaults.conf gegeben – Gideon

+2

Dann macht dies Sinn: Im Standalone-Modus wird eine gierige Strategie verwendet und es werden so viele Executoren erstellt, wie Kerne und Speicher verwendet werden. In Ihrem Fall haben Sie pro Executor 1 Core angegeben, also wird Spark versuchen, 8 Executoren zu erstellen, da 8 Cores verfügbar sind. Da jedoch nur 30 GB RAM verfügbar sind, können nur 6 erstellt werden (6 Executoren mit jeweils 5 GB RAM). Sie haben 6 Executoren. 'spark.executor.instances' ist eine Nur-YARN-Konfiguration. Am besten stellen Sie die Gesamtanzahl der Kerne mit 'func.cores.max' auf 2, sagen Sie mir, ob das besser ist. –

Antwort

5

TL finden; DR

Verwenden spark.cores.max stattdessen zu definieren die Gesamtzahl der Kerne zur Verfügung, und so begrenzt die Anzahl von Vollstreckern.


In Standalone-Modus, eine gierig Strategie verwendet wird und wie viele Testamentsvollstrecker geschaffen werden, wie es Kerne und Speicher auf dem Arbeiter zur Verfügung.

In Ihrem Fall haben Sie pro Executor 1 Kern und 5 GB Speicher angegeben. Im Folgenden wird von Spark berechnet werden:

  • Da es 8 Cores zur Verfügung, wird es versuchen, 8 Testamentsvollstrecker zu erstellen.
  • Da jedoch nur 30 GB Speicher verfügbar sind, können nur 6 Executoren erstellt werden. Jeder Executor verfügt über 5 GB Speicher, was 30 GB entspricht.
  • Daher werden 6 Executoren erstellt, und insgesamt werden 6 Kerne mit 30 GB Speicher verwendet.

Spark erfüllt grundsätzlich, was Sie gefragt haben. Um zu erreichen, was Sie wollen, können Sie die spark.cores.max Option dokumentiert here verwenden und die genaue Anzahl der Kerne, die Sie benötigen, angeben.

Einige Nebennoten:

  • spark.executor.instances ist ein GARN-only Konfiguration
  • spark.driver.memory standardmäßig auf 1 Kern bereits

ich auch auf der Lockerung des Begriffs der Zahl arbeitete von Executoren im Standalone-Modus, könnte dies in eine nächste Version von Spark integriert werden und hoffentlich dabei helfen, die Anzahl der Executoren, die Sie haben werden, genau zu ermitteln, ohne sie unterwegs berechnen zu müssen.

+0

Ich erhalte einen Fehler beim Übergeben des Jobs an den Master, der besagt - Erster Job nicht akzeptiert - http://Stackoverflow.com/questions/38359801/spark-job-submitted-waiting-taskschedulerimpl-initial-job-not-accepted - Any Relation wrt Anzahl der Kerne/Speicher zugeordnet werden soll ... Verwenden von POST-API-Aufruf zum Senden von Anwendung an Spark wie in meiner Frage angegeben –