Я пытаюсь настроить планировщик емкости в Amazon EMR с двумя очередями в дополнение к очереди по умолчанию. Я успешно создал очереди user1 и user2, однако, когда я использую spark-submit для запуска скрипта в новой очереди, он застревает в ACCEPTED. Странно то, что я все еще могу отправлять заявки в очередь по умолчанию, и все работает, как ожидалось.
В настоящее время используется планировщик по умолчанию, но я пробовал использовать планировщик Dominant с теми же результатами.
Я посмотрел журналы, и они в основном выглядят нормально. Иногда я получаю сообщение об ошибке:
2019-12-04 19:18:28,888 WARN org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.LeafQueue (ResourceManager Event Processor): maximum-am-resource-percent is insufficient to start a single application in queue, it is likely set too low. skipping enforcement to allow at least one application to start
Несмотря на то, что у меня установлено значение «Максимальный процент ресурсов» на 100% (я думаю), я также безуспешно пытался установить это свойство явно для каждой очереди.
Как я выполняю эту работу:
spark-submit --master yarn --queue user1 test.py
Количество работающих (исправных) узлов задачи / ядра, похоже, не имеет значения.
Я новичок в управлении Spark, поэтому приветствую любые рекомендации. Мне не удалось найти в Интернете ничего, кроме ответов о том, что ресурсов нет. Моя конфигурация вполне может не выделять достаточно ресурсов, но я не думаю, что это будет так, если очередь по умолчанию все еще работает нормально. Вот мой файл capacity-scheduler.xml для справки:
<?xml version="1.0" encoding="UTF-8" ?>
<!--
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. See accompanying LICENSE file.
-->
<configuration>
<property>
<name>yarn.scheduler.capacity.maximum-applications</name>
<value>10000</value>
<description>
Maximum number of applications that can be pending and running.
</description>
</property>
<property>
<name>yarn.scheduler.capacity.maximum-am-resource-percent</name>
<value>1.0</value>
<description>
Maximum percent of resources in the cluster which can be used to run
application masters i.e. controls number of concurrent running
applications.
</description>
</property>
<property>
<name>yarn.scheduler.capacity.resource-calculator</name>
<value>org.apache.hadoop.yarn.util.resource.DefaultResourceCalculator</value>
<description>
The ResourceCalculator implementation to be used to compare
Resources in the scheduler.
The default i.e. DefaultResourceCalculator only uses Memory while
DominantResourceCalculator uses dominant-resource to compare
multi-dimensional resources such as Memory, CPU etc.
</description>
</property>
<property>
<name>yarn.scheduler.capacity.root.queues</name>
<value>user1,user2,default</value>
<description>
The queues at the this level (root is the root queue).
</description>
</property>
<property>
<name>yarn.scheduler.capacity.root.default.capacity</name>
<value>10</value>
<description>Default queue target capacity.</description>
</property>
<property>
<name>yarn.scheduler.capacity.root.default.user-limit-factor</name>
<value>2</value>
<description>
Default queue user limit a percentage from 0.0 to 1.0.
</description>
</property>
<property>
<name>yarn.scheduler.capacity.root.default.maximum-capacity</name>
<value>40</value>
<description>
The maximum capacity of the default queue.
</description>
</property>
<property>
<name>yarn.scheduler.capacity.root.default.state</name>
<value>RUNNING</value>
<description>
The state of the default queue. State can be one of RUNNING or STOPPED.
</description>
</property>
<property>
<name>yarn.scheduler.capacity.root.default.acl_submit_applications</name>
<value>*</value>
<description>
The ACL of who can submit jobs to the default queue.
</description>
</property>
<property>
<name>yarn.scheduler.capacity.root.default.acl_administer_queue</name>
<value>*</value>
<description>
The ACL of who can administer jobs on the default queue.
</description>
</property>
<property>
<name>yarn.scheduler.capacity.node-locality-delay</name>
<value>40</value>
<description>
Number of missed scheduling opportunities after which the CapacityScheduler
attempts to schedule rack-local containers.
Typically this should be set to number of nodes in the cluster, By default is setting
approximately number of nodes in one rack which is 40.
</description>
</property>
<property>
<name>yarn.scheduler.capacity.queue-mappings</name>
<value />
<description>
A list of mappings that will be used to assign jobs to queues
The syntax for this list is [u|g]:[name]:[queue_name][,next mapping]*
Typically this list will be used to map users to queues,
for example, u:%user:%user maps all users to queues with the same name
as the user.
</description>
</property>
<property>
<name>yarn.scheduler.capacity.queue-mappings-override.enable</name>
<value>false</value>
<description>
If a queue mapping is present, will it override the value specified
by the user? This can be used by administrators to place jobs in queues
that are different than the one specified by the user.
The default is false.
</description>
</property>
<property>
<name>yarn.scheduler.capacity.per-node-heartbeat.maximum-offswitch-assignments</name>
<value>1</value>
<description>
Controls the number of OFF_SWITCH assignments allowed
during a node's heartbeat. Increasing this value can improve
scheduling rate for OFF_SWITCH containers. Lower values reduce
"clumping" of applications on particular nodes. The default is 1.
Legal values are 1-MAX_INT. This config is refreshable.
</description>
</property>
<property>
<name>yarn.scheduler.capacity.root.accessible-node-labels</name>
<value>*</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.accessible-node-labels.CORE.capacity</name>
<value>100</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.default.accessible-node-labels</name>
<value>*</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.default.accessible-node-labels.CORE.capacity</name>
<value>100</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.user1.capacity</name>
<value>50</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.user1.user-limit-factor</name>
<value>2</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.user1.maximum-capacity</name>
<value>50</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.user2.capacity</name>
<value>40</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.user2.user-limit-factor</name>
<value>2</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.user2.maximum-capacity</name>
<value>50</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.user1.state</name>
<value>RUNNING</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.user2.state</name>
<value>RUNNING</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.user1.acl_submit_applications</name>
<value>*</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.user2.acl_submit_applications</name>
<value>*</value>
</property>
</configuration>
Спасибо сет
Начиная с версии 5.19.0, EMR использует метки узлов YARN для различных групп узлов (MASTER
/ CORE
/ TASK
) [1]. Для правильной работы настраиваемых очередей в этой настройке необходимо явно настроить сопоставление между очередями и метками узлов.
Если вы посмотрите на capacity-scheduler.xml
, вы заметите, что EMR уже настроил это для вас для root
и default
очереди:
<property>
<name>yarn.scheduler.capacity.root.default.accessible-node-labels</name>
<value>*</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.default.accessible-node-labels.CORE.capacity</name>
<value>100</value>
</property>
Вот почему запуск приложения на default
очередь работает корректно.
Итак, чтобы ваши пользовательские очереди работали, вам нужно установить их accessible-node-labels
и capacity
настройки. Вы должны иметь возможность использовать то же самое capacity
настройки, как и в остальной части конфигурации вашей очереди.
[1] https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-master-core-task-nodes.html