Подтвердить что ты не робот

YARN не вытесняет ресурсы на основе справедливых акций при работе Spark

У меня проблема с повторной балансировкой ресурсов ресурсов Apache Spark по очереди YARN Ярмарка запланированных.

Для тестов я настроил Hadoop 2.6 (также попытался использовать 2.7) для запуска в псевдораспределенном режиме с локальной HDFS на MacOS. Для подачи заявки используется "Pre-build Spark 1.4 для Hadoop 2.6 и более поздних версий" (также попробовал 1.5) из сайта Spark.

При тестировании с базовой конфигурацией на заданиях Hadoop MapReduce, Fair Scheduler работает так, как ожидалось: когда ресурсы кластера превышают некоторый максимум, справедливые доли вычисляются, а ресурсы для заданий в разных очередях выгружаются и балансируются на основе этих вычислений.

Тот же тест выполняется с заданиями Spark, в этом случае YARN делает правильные вычисления справедливых акций для каждой работы, но ресурсы для контейнеров Spark не перебалансируются.

Вот мои файлы conf:

$HADOOP_HOME/и т.д./Hadoop/пряжа 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/и т.д./Hadoop/справедливой 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/и т.д./Hadoop/ядро-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/и т.д./Hadoop/ядро-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>

И тестовый пример:

Запустите задание в очереди "prod" с весом 40 (должно выделять 40% всех ресурсов), как и ожидалось, задание принимает все необходимые свободные ресурсы (62,5% ресурсов кластеров).

./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

После этого запустите ту же работу в очереди "dev.eng" с весом 60, это означает, что задание должно выделять 60% всех ресурсов и уменьшить первые ресурсы работы до ~ 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

К сожалению, ресурсы кластера не меняются - 62,5% для первого задания и 37,5% для второго.

4b9b3361

Ответ 1

Вам нужно установить один из тайм-аутов прерывания в вашем распределении xml. Один для минимальной доли и один для справедливой доли, оба в секундах. По умолчанию таймауты не установлены.

От Hadoop: Окончательное руководство 4-го издания

Если очередь ожидает до тех пор, пока ее минимальный тайм-аут минимального ресурса без получения минимального гарантированного ресурса, тогда планировщик может выгружать другие контейнеры. Тайм-аут по умолчанию устанавливается для всех очередей через элемент верхнего уровня defaultMinSharePreemptionTimeout в файл распределения и для каждой очереди, установив Элемент minSharePreemptionTimeout для очереди.

Аналогично, если очередь остается ниже половины ее справедливой доли в течение длительного времени как тайм-аут освобождения долевого участия, тогда планировщик может упредить другие контейнеры. Тайм-аут по умолчанию устанавливается для всех очередей через defaultFairSharePreemptionTimeout элемент верхнего уровня в распределении файла и для каждой очереди, установив fairSharePreemptionTimeout в очереди. Порог также может быть изменен с его значения по умолчанию 0,5 путем установки defaultFairSharePreemptionThreshold и fairSharePreemptionThreshold (для очереди).

Ответ 2

Справедливый планировщик не убивает контейнеры для первой работы, он только ждет, пока некоторые ресурсы освободятся, и зарезервируйте их для использования вторым заданием. Если ресурсы не освобождены от первого задания, планировщик не может назначить эти ресурсы второму заданию.

В заданиях MapReduce каждая задача карты или сокращения требует создания нового контейнера, и планировщик может заблокировать задание для создания новых контейнеров, если он превысил свою цитату (в зависимости от емкости очереди).

В Spark все по-другому, исполнители запускаются в начале задания, и им отправляются разные задачи (этапы). Тогда ресурсы не освобождаются, и они не могут быть перераспределены.

Может быть динамическое распределение может помочь: http://spark.apache.org/docs/1.6.1/configuration.html#dynamic-allocation