Почему vcore всегда равно числу узлов в Spark на YARN?

У меня есть кластер Hadoop с 5 узлами, каждый из которых имеет 12 ядер с 32 ГБ памяти. Я использую YARN в качестве фреймворка MapReduce, поэтому у меня есть следующие настройки с YARN:

  • yarn.nodemanager.resource.cpu-vcores = 10
  • yarn.nodemanager.resource.memory-MB =26100

Затем метрики кластера, показанные на моей странице кластера YARN ( http://myhost:8088/cluster/apps), показали, что общее количество VCores равно 40. Это довольно хорошо!

Затем я установил Spark поверх него и использовал spark-shell в режиме клиента пряжи.

Я запустил одно задание Spark со следующей конфигурацией:

  • -драйвер-память 20480м
  • --executor-память 20000м
  • --num-исполнителей 4
  • --executor-cores 10
  • --conf spark.yarn.am.cores = 2
  • --conf spark.yarn.executor.memoryOverhead = 5600

Я установил --executor-cores равным 10, --num-executors равным 4, поэтому, по логике, должно быть полностью использовано 40 Vcores. Однако, когда я проверяю ту же страницу кластера YARN после запуска задания Spark, используются только 4 Vcores и всего 4 Vcores.

Я также обнаружил, что есть параметр в capacity-scheduler.xml - называется yarn.scheduler.capacity.resource-calculator:

"Реализация ResourceCalculator, которая будет использоваться для сравнения ресурсов в планировщике. Значение по умолчанию, т.е. DefaultResourceCalculator, использует только память, тогда как DominantResourceCalculator использует dominant-resource для сравнения многомерных ресурсов, таких как память, процессор и т. Д."

Затем я изменил это значение на DominantResourceCalculator,

Но потом, когда я перезапустил YARN и запустил то же самое приложение Spark, я все же получил тот же результат, скажем, метрики кластера все еще указывали, что VCores использовало 4! Я также проверил использование процессора и памяти на каждом узле с помощью команды htop, и обнаружил, что ни один из узлов не занимал все 10 ядер процессора полностью занятыми. В чем может быть причина?

Я также пытался выполнить ту же работу Spark в мелкозернистом виде, скажем, с --num executors 40 --executor-cores 1 Таким образом, я снова проверил состояние процессора на каждом рабочем узле, и все ядра процессора полностью заняты.

4 ответа

Мне было интересно то же самое, но смена калькулятора ресурсов сработала для меня.
Вот как я устанавливаю свойство:

    <property>
        <name>yarn.scheduler.capacity.resource-calculator</name>      
        <value>org.apache.hadoop.yarn.util.resource.DominantResourceCalculator</value>       
    </property>

Проверьте в пользовательском интерфейсе YARN в приложении, сколько контейнеров и vcores назначено, с изменением количество контейнеров должно быть исполнителями +1, а vcores должно быть: (executor-cores*num-executors) +1.

Не устанавливая планировщик YARN в FairScheduler, я увидел то же самое. Тем не менее, пользовательский интерфейс Spark показал правильное количество задач, предполагая, что ничего не случилось. Мой кластер показал почти 100% загрузку процессора, что подтвердило это.

После настройки FairScheduler ресурсы YARN выглядели правильно.

Исполнители берут по 10 ядер каждый, по 2 ядра для Application Master = 42 ядра, запрошенных, если у вас всего 40 vCores.

Сократите количество ядер до 8 и перезапустите каждый NodeManager.

Также измените yarn-site.xml и установите эти свойства:

yarn.scheduler.minimum-allocation-mb
yarn.scheduler.maximum-allocation-mb
yarn.scheduler.minimum-allocation-vcores
yarn.scheduler.maximum-allocation-vcores

Людям, которые ищут способы выполнить эту настройку в EMR, может помочь приведенный ниже пример. Это сработало для меня.

Он гарантирует, что Yarn не выделяет ядер больше, чем настроено на узле. Если в приведенном ниже json-файле не настроен планировщик, по умолчанию используется пряжаcapacity-scheduler

Расположение: Emr Новая консоль > конфигурации > Конфигурации группы экземпляров > переключатель «Выбрать главный» — мастер группы экземпляров > нажмите «Переконфигурировать» > «Изменить в JSON».

      [
  {
    "Classification": "yarn-site",
    "Properties": {
      "yarn.nodemanager.resource.cpu-vcores": "5"
    }
  },
  {
    "Classification": "capacity-scheduler",
    "Properties": {
      "yarn.scheduler.capacity.resource-calculator": "org.apache.hadoop.yarn.util.resource.DominantResourceCalculator"
    }
  }
]
Другие вопросы по тегам