2015-11-26 13 views
9

Ich arbeite auf Apache Spark auf Amazon Elastic Map Reduce (EMR). Momentan laufe ich auf emr-4.1.0, welches Amazon Hadoop 2.6.0 und Spark 1.5.0 beinhaltet.Warum weist Yarn on EMR nicht alle Knoten Spark-Jobs zu?

Wenn ich den Job starte, hat YARN alle Worker-Knoten korrekt dem Funke-Job zugewiesen (natürlich mit einem für den Treiber).

Ich habe die magische Eigenschaft "maximizeResourceAllocation" auf "true" gesetzt und die Spark-Eigenschaft "spark.dynamicAllocation.enabled" ebenfalls auf "true" gesetzt.

Wenn ich jedoch die Größe des emr-Clusters durch Hinzufügen von Knoten zum CORE-Pool von Arbeitscomputern ändere, fügt YARN nur einige der neuen Knoten zum Spark-Job hinzu.

Zum Beispiel hatte ich heute Morgen einen Job, der 26 Knoten (m3.2xlarge, wenn das wichtig ist) - 1 für den Treiber, 25 Executoren. Ich wollte den Job beschleunigen, also habe ich versucht, weitere 8 Knoten hinzuzufügen. YARN hat alle neuen Knoten aufgenommen, aber nur eine davon dem Spark-Job zugewiesen. Spark hat den neuen Knoten erfolgreich aufgenommen und benutzt ihn als Executor, aber meine Frage ist, warum YARN die anderen 7 Knoten einfach im Leerlauf lässt.

Es ist ärgerlich für offensichtliche Gründe - ich muss für die Ressourcen bezahlen, auch wenn sie nicht verwendet werden, und mein Job hat sich überhaupt nicht beschleunigt!

Jeder weiß, wie YARN entscheidet, wenn Knoten zu laufenden Funkenjobs hinzugefügt werden? Welche Variablen spielen eine Rolle? Erinnerung? V-Kerne? Etwas?

Vielen Dank im Voraus!

+1

Ja, willkommen in der nervenden Welt von YARN! Haben Sie in der capacity-scheduler.xml die Datei gam.scheduler.capacity.resource-calculator = org.apache.hadoop.yarn.util.resource.DominantResourceCalculator eingestellt? –

+0

Ich habe nicht! Ich kann es versuchen (wahrscheinlich erst nächste Woche), aber ich fange an zu vermuten, dass Spark selbst nicht mehr Knoten anfordern wird, als zu dem Zeitpunkt, als es gestartet wird - aber ich könnte falsch liegen! – retnuH

+2

Viel Glück :) Ich persönlich denke, dass YARN - nicht Spark - ist das Problem. Ich hatte nie Probleme mit Ressourcen, die nicht genutzt wurden, wenn ich Spark im Standalone-Modus (vor EMR 4.x) laufen ließ. Seit dem Upgrade auf EMR 4.x (und damit YARN) hatte ich jedoch eine Million Probleme - einschließlich der Unterauslastung von Kernen ... –

Antwort

16

Okay, mit Hilfe von @sean_r_owen konnte ich dies aufspüren.

Das Problem war das: wenn spark.dynamicAllocation.enabled auf true eingestellt wird, sollte spark.executor.instances nicht festgelegt werden - ein expliziter Wert für diese überschreibt dynamische Zuordnung und deaktiviert es. Es stellt sich heraus, dass EMR es in den Hintergrund stellt, wenn Sie es nicht selbst einstellen. Um das gewünschte Verhalten zu erhalten, müssen Sie explizit gesetzt spark.executor.instances auf 0

Für die Aufzeichnungen, hier ist der Inhalt einer der Dateien, die wir auf die --configurations Flag übergeben, wenn ein EMR-Cluster zu erstellen:

[ 
    { 
     "Classification": "capacity-scheduler", 
     "Properties": { 
      "yarn.scheduler.capacity.resource-calculator": "org.apache.hadoop.yarn.util.resource.DominantResourceCalculator" 
     } 
    }, 

    { 
     "Classification": "spark", 
     "Properties": { 
      "maximizeResourceAllocation": "true" 
     } 
    }, 

    { 
     "Classification": "spark-defaults", 
     "Properties": { 
      "spark.dynamicAllocation.enabled": "true", 
      "spark.executor.instances": "0" 
     } 
    } 
] 

Dies gibt uns einen EMR-Cluster, in dem Spark beim Ausführen von Jobs alle Knoten einschließlich hinzugefügter Knoten verwendet. Es scheint auch, alle/den größten Teil des Speichers und alle (?) Die Kerne zu verwenden.

(Ich bin nicht ganz sicher, dass es alle tatsächlichen Kerne verwendet, aber es ist definitiv mehr als 1 VCore verwenden, was es vorher nicht war, aber nach Glennie Helles Rat benimmt es sich jetzt besser und mit der Hälfte von die aufgelisteten VCores, die der tatsächlichen Anzahl der Kerne zu entsprechen scheint ...)

+0

Ich benutze EMR 4.4. Ich probierte diese Konfiguration mit c4.xlarge Maschinen mit 2 Arbeiter Knoten und 1 Master und läuft mit Garn Client-Modus, aber meine Ressourcen sind nicht ausgelastet. Auch funke läuft nur 1 Executor, während es 2 Executoren sind, werden alle 4 Cores für 1 Executor verwendet und der andere Executor ist im Leerlauf – Nipun

+0

Beachten Sie, dass der Treiber Ihres Programms einen Worker-Knoten braucht. Wenn Sie also nur zwei Worker-Knoten haben, wird 1 dem Treiber zugewiesen und der andere wird als Executor verwendet. Wenn Sie zwei Executoren haben möchten, benötigen Sie 3 Arbeiter. Du bezahlst im Grunde für einen fast völlig untätigen Master und, abhängig von deinem Funke-Programm, auch einen weitgehend untätigen Arbeiter. – retnuH

+0

dynamicAllocation ist jetzt die Standardkonfiguration für EMRs> 4.0.0 (http://docs.aws.amazon.com/ElasticMapReduce/latest/ReleaseGuide/emr-spark-configure.html#spark-dynamic-allocation) –