2015-10-12 3 views
20

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

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

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

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

Вот мои конф файлы:

$ 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> 

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

Выполнить задание на "прод" очереди с весом 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% для второй.

ответ

0

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

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

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

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

+0

Фактически он убивает контейнеры на первом задании. Все зависит от того, как вы настроили превенцию. – tk421

4

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

От Hadoop: The Definitive Guide 4th Edition

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

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

+0

Что такое допустимые значения таймаута? –