7

Ich bin neu bei Spark auf YARN und verstehe nicht die Beziehung zwischen dem YARN Containers und dem Spark Executors. Ich habe die folgende Konfiguration basierend auf den Ergebnissen des Skripts yarn-utils.py ausprobiert, mit dem die optimale Clusterkonfiguration ermittelt werden kann.Funke auf YARN Ressourcenmanager: Beziehung zwischen YARN Containern und Spark Executors

Die Hadoop Cluster (HDP 2.4) ich arbeite:

  • 1 Master-Knoten:
    • CPU: 2 CPUs mit 6 Adern jeweils = 12 Kerne
    • RAM: 64 GB
    • SSD: 2 x 512 GB
  • 5 Slave-Knoten:
    • CPU: 2 CPUs mit 6 Adern jeweils = 12 Kerne
    • RAM: 64 GB
    • HDD: 4 x 3 TB = 12 TB
  • HBase installiert ist (dies ist einer der Parameter, für das Skript unten)

So lief ich python yarn-utils.py -c 12 -m 64 -d 4 -k True (c = Kern, m = Speicher, d = hdds, k = hbase installiert) und bekam folgendes Ergebnis:

Using cores=12 memory=64GB disks=4 hbase=True 
Profile: cores=12 memory=49152MB reserved=16GB usableMem=48GB disks=4 
Num Container=8 
Container Ram=6144MB 
Used Ram=48GB 
Unused Ram=16GB 
yarn.scheduler.minimum-allocation-mb=6144 
yarn.scheduler.maximum-allocation-mb=49152 
yarn.nodemanager.resource.memory-mb=49152 
mapreduce.map.memory.mb=6144 
mapreduce.map.java.opts=-Xmx4915m 
mapreduce.reduce.memory.mb=6144 
mapreduce.reduce.java.opts=-Xmx4915m 
yarn.app.mapreduce.am.resource.mb=6144 
yarn.app.mapreduce.am.command-opts=-Xmx4915m 
mapreduce.task.io.sort.mb=2457 

Diese Einstellungen habe ich über die Ambari-Schnittstelle vorgenommen und den Cluster neu gestartet. Die Werte stimmen auch grob mit dem überein, was ich zuvor manuell berechnet habe.

Ich habe jetzt Probleme

  • die optimalen Einstellungen für meinen spark-submit Skript
    • Parameter --num-executors, finden --executor-cores & --executor-memory.
  • die Beziehung zwischen dem GARN Behälter zu erhalten und dem Spark-Testamentsvollstrecker
  • der Hardware-Informationen in meinem Spark-History UI (weniger Speicher als ich durch Multiplikation mit dem Arbeitsknoten Menge an Gesamtspeichern (wenn berechnet gesetzt gezeigt zu verstehen))
  • das Konzept des vcores in GARN verstehen, hier konnte ich keine nützliche Beispiele noch

aber ich diesen Beitrag finden gefunden What is a container in YARN?, aber diese helfen nicht wirklich, wie es doesn‘ t beschreiben die Beziehung zum Executor s.

Kann jemand helfen, eine oder mehrere der Fragen zu lösen?

Antwort

10

Ich werde meine Erkenntnisse hier Schritt für Schritt berichten:

  • Erste wichtige Sache ist, diese Tatsache (Quelle: this Cloudera documentation):

    Wenn Funken auf GARN läuft, jeder Funken Testamentsvollstrecker läuft als ein YARN-Behälter. [...]

  • Dies bedeutet, dass die Anzahl der Container immer die gleichen ist wie die Executoren, die von einer Spark-Anwendung, z. über --num-executors Parameter in Spark-Submit.

  • Eingestellt von der yarn.scheduler.minimum-allocation-mb reserviert jeder Container immer mindestens diese Menge an Speicher. Dies bedeutet, wenn der Parameter --executor-memory auf z.B. nur 1g, aber yarn.scheduler.minimum-allocation-mb ist z.B. 6g, der Container ist viel größer als von der Spark-Anwendung benötigt. Wenn umgekehrt der Parameter --executor-memory auf etwas höher als der Wert yarn.scheduler.minimum-allocation-mb gesetzt ist, wird z. 12g reserviert der Container dynamisch mehr Speicher, aber nur, wenn die angeforderte Speichermenge kleiner oder gleich yarn.scheduler.maximum-allocation-mb ist.

  • Der Wert von yarn.nodemanager.resource.memory-mb legt fest, wieviel Speicher in Summe von allen Containern eines Hosts zugewiesen werden kann!

=> So yarn.scheduler.minimum-allocation-mb Einstellung ermöglicht es Ihnen, kleinere Behälter laufen z.B. für kleinere Executoren (sonst wäre es Speicherverschwendung).

=> Einstellung yarn.scheduler.maximum-allocation-mb auf den Maximalwert (zum Beispiel gleich yarn.nodemanager.resource.memory-mb) ermöglicht es Ihnen, größere Testamentsvollstrecker zu definieren (mehr Speicher zugewiesen werden, wenn nötig, zum Beispiel durch --executor-memory Parameter).