Ich habe ein Problem mit dem Ausgleich von Apache Spark-Jobs Ressourcen auf YARN Fair Scheduled Warteschlangen.YARN Preempting Ressourcen basierend auf fairen Aktien beim Ausführen eines Spark-Jobs
Für die Tests habe ich konfiguriert Hadoop 2.6 (versuchte 2.7 auch) im pseudo-verteilten Modus mit lokalen HDFS auf MacOS laufen. Für die Jobeinreichung wurde "Pre-build Spark 1.4 für Hadoop 2.6 und höher" (auch 1.5) verwendet. Verteilung von .
Beim Testen mit Hadoop MapReduce-Grundeinstellungen funktioniert Fair Scheduler wie erwartet: Wenn Ressourcen des Clusters ein Maximum überschreiten, werden gerechte Anteile berechnet und Ressourcen für Jobs in verschiedenen Warteschlangen werden basierend auf diesen Berechnungen ausgeschlossen und ausgeglichen.
Derselbe Test wird mit Spark-Jobs ausgeführt. In diesem Fall führt YARN korrekte Berechnungen der fairen Freigaben für jeden Job durch, aber Ressourcen für Spark-Container werden nicht neu ausgeglichen.
Hier sind meine conf Dateien:
$ HADOOP_HOME/etc/hadoop/Garn-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.spark_shuffle.class</name>
<value>org.apache.spark.network.yarn.YarnShuffleService</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value>
</property>
<property>
<name>yarn.scheduler.fair.preemption</name>
<value>true</value>
</property>
</configuration>
$ HADOOP_HOME/etc/hadoop/fair-scheduler.xml
<?xml version="1.0" encoding="UTF-8"?>
<allocations>
<defaultQueueSchedulingPolicy>fair</defaultQueueSchedulingPolicy>
<queue name="prod">
<weight>40</weight>
<schedulingPolicy>fifo</schedulingPolicy>
</queue>
<queue name="dev">
<weight>60</weight>
<queue name="eng" />
<queue name="science" />
</queue>
<queuePlacementPolicy>
<rule name="specified" create="false" />
<rule name="primaryGroup" create="false" />
<rule name="default" queue="dev.eng" />
</queuePlacementPolicy>
</allocations>
$ HADOOP_HOME/etc/hadoop/Kern-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>
$ HADOOP_HOME/etc/hadoop/Kern-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
Und der Testfall ist:
Führen Sie einen Job auf der "prod" Warteschlange mit Gewicht 40 (müssen 40% aller zuteilen Ressourcen), benötigt der Job wie erwartet alle benötigten freien Ressourcen (62,5% der Cluster-Ressourcen).
./bin/spark-submit --class org.apache.spark.examples.SparkPi \
--master yarn-cluster \
--driver-memory 512M \
--executor-memory 768M \
--executor-cores 1 \
--num-executors 2 \
--queue prod \
lib/spark-examples*.jar 100000
Danach die gleiche Arbeit auf der „dev.eng“ Warteschlange laufen mit dem Gewicht 60, dass der Job bedeutet 60% aller Ressourcen zuteilen müssen und verringern die Ressourcen des ersten Job zu ~ 40%.
./bin/spark-submit --class org.apache.spark.examples.SparkPi \
--master yarn-cluster \
--driver-memory 512M \
--executor-memory 768M \
--executor-cores 1 \
--num-executors 2 \
--queue dev.eng \
lib/spark-examples*.jar 100000
Leider ändern sich Clusterressourcen nicht - 62,5% für den ersten Job und 37,5% für den zweiten Job.
Eigentlich tötet es Container auf den ersten Job. Alles hängt davon ab, wie Sie Vorkaufsrechte einrichten. – tk421