Ho un problema con il riequilibrio delle risorse dei processi Apache Spark sulle code YARN Fair Scheduled.YARN non prelude risorse basate su azioni corrette durante l'esecuzione di un lavoro Spark
Per i test ho configurato Hadoop 2.6 (provato anche 2.7) per l'esecuzione in modalità pseudo-distribuita con HDFS locale su MacOS. Per la presentazione del lavoro è stata utilizzata la distribuzione "Pre-build Spark 1.4 per Hadoop 2.6 e successive" (anche la versione 1.5) da Spark's website.
Quando testato con la configurazione di base sui lavori Hadoop MapReduce, Fair Scheduler funziona come previsto: quando le risorse del cluster superano il massimo, vengono calcolate equamente le condivisioni e le risorse per i lavori in code diverse vengono preventivate e bilanciate in base a questi calcoli.
Lo stesso test viene eseguito con i lavori Spark, in questo caso YARN sta eseguendo calcoli corretti delle azioni corrette per ogni lavoro, ma le risorse per i contenitori Spark non vengono riequilibrate.
Qui sono i miei file conf:
$ HADOOP_HOME/etc/Hadoop/filato-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/fiera-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/core-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/core-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>
E il banco di prova è:
eseguire un lavoro sulla coda di "pungolo" con un peso di 40 (deve destinare il 40% di tutti i risorse), come previsto, il lavoro prende tutte le risorse libere necessarie (il 62,5% delle risorse dei cluster).
./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
Dopo che eseguire lo stesso lavoro nella coda "dev.eng" con il peso 60, che significa che il lavoro deve destinare il 60% di tutte le risorse e diminuire le risorse del primo lavoro al ~ 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
Sfortunatamente, le risorse dei cluster non cambiano: il 62,5% per il primo lavoro e il 37,5% per il secondo.
In realtà uccide i contenitori sul primo lavoro. Tutto dipende da come si imposta la prelazione. – tk421