Настройка планировщика Hadoop

LinuxBeginner
Практиковаться сейчас

Введение

В древнем Египте дворец фараона был великолепным свидетельством могущества и процветания царства. Однако за позолоченным фасадом назревал кризис. В огромных хранилищах фараона, наполненных дарами Нила, царил беспорядок. Жрецы, отвечавшие за распределение ресурсов, не справлялись с потребностями жителей.

На помощь пришёл Аменхотеп — одарённый молодой жрец, которому поручили навести порядок в распределении ресурсов царства. Ему предстояло разработать систему, которая обеспечила бы справедливое и эффективное распределение ценных запасов, чтобы каждый житель получил свою долю.

Фараон оценил ум и преданность Аменхотепа и предоставил ему доступ к новейшему технологическому чуду — системе Hadoop YARN (Yet Another Resource Negotiator). С этим мощным инструментом Аменхотеп взялся изучить тонкости работы планировщика — важного компонента YARN, который поможет ему достичь цели.

Знакомство с планировщиками Hadoop YARN

На этом этапе вы познакомитесь с политиками планирования, доступными в Hadoop YARN, и проверите, какой планировщик запущен.

Сначала переключитесь на пользователя Hadoop. Выполняйте все команды этой лабораторной работы в этом терминале:

su - hadoop

Явно укажите каталог конфигурации. В этом образе Hadoop установлен в /home/hadoop/hadoop; каталог /etc/hadoop/conf не используется.

export HADOOP_CONF_DIR=/home/hadoop/hadoop/etc/hadoop

Hadoop YARN поддерживает Fair Scheduler и Capacity Scheduler. Fair Scheduler распределяет ресурсы между приложениями с течением времени; относительные доли ресурсов зависят от весов очередей. Capacity Scheduler выделяет очередям гарантированную ёмкость в иерархической структуре, при этом неиспользуемые ресурсы могут совместно использоваться другими очередями.

В Hadoop 3.3.6 нет подкоманды yarn scheduler. Чтобы проверить, какой планировщик действительно запущен, запросите REST API ResourceManager, а не исходите из предположения, что настройки из файла конфигурации уже применены. Сохраните ответ API:

curl -fsS --retry 15 --retry-connrefused --retry-delay 1 http://localhost:8088/ws/v1/cluster/scheduler -o /home/hadoop/scheduler-initial.json

Выведите тип активного планировщика:

python3 - <<'PY'
import json
with open('/home/hadoop/scheduler-initial.json') as stream:
    info = json.load(stream)['scheduler']['schedulerInfo']
print(info['type'])
PY

В чистой среде лабораторной работы ожидается такой результат:

capacityScheduler

Не закрывайте этот терминал: он понадобится на следующих этапах. Вы настроите каждый планировщик с помощью файлов конфигурации Hadoop и перезапустите ResourceManager, чтобы загрузить выбранный класс планировщика.

Настройка Fair Scheduler

На этом этапе вы настроите Fair Scheduler, чтобы он распределял ресурсы между очередями citizens и priests.

Работая от имени пользователя Hadoop, создайте файл распределения, выполнив весь блок команды:

cat > /home/hadoop/fair-scheduler.xml <<'XML'
<?xml version="1.0"?>
<allocations>
  <defaultQueueSchedulingPolicy>fair</defaultQueueSchedulingPolicy>
  <queue name="root">
    <weight>1.0</weight>
    <queue name="citizens">
      <weight>1.0</weight>
      <minResources>1024 mb, 1 vcores</minResources>
    </queue>
    <queue name="priests">
      <weight>2.0</weight>
      <minResources>2048 mb, 2 vcores</minResources>
    </queue>
  </queue>
</allocations>
XML

Вес очереди citizens равен 1, а минимальный объём ресурсов — 1024 МБ памяти и 1 vcore. Вес очереди priests равен 2, а минимальный объём ресурсов — 2048 МБ памяти и 2 vcores. Минимальные ресурсы — это целевые значения, которые зависят от доступных ресурсов кластера; веса влияют на распределение оставшихся ресурсов.

Выберите Fair Scheduler и укажите путь к файлу распределения в yarn-site.xml. Следующая команда сохраняет существующие настройки NodeManager:

python3 - <<'PY'
import os
import xml.etree.ElementTree as ET

path = os.path.join(os.environ['HADOOP_CONF_DIR'], 'yarn-site.xml')
tree = ET.parse(path)
root = tree.getroot()
settings = {
    'yarn.resourcemanager.scheduler.class':
        'org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler',
    'yarn.scheduler.fair.allocation.file': '/home/hadoop/fair-scheduler.xml',
}
for name, value in settings.items():
    prop = next((p for p in root.findall('property') if p.findtext('name') == name), None)
    if prop is None:
        prop = ET.SubElement(root, 'property')
        ET.SubElement(prop, 'name').text = name
        ET.SubElement(prop, 'value')
    prop.find('value').text = value
tree.write(path, encoding='UTF-8', xml_declaration=True)
PY

Чтобы изменить класс планировщика, нужно перезапустить ResourceManager. В этом учебном кластере запущенных приложений нет. Остановите и запустите только ResourceManager:

yarn --daemon stop resourcemanager
yarn --daemon start resourcemanager

Снова запросите информацию о запущенном планировщике. Параметры повтора дают ResourceManager время на запуск; во время запуска могут кратковременно возникать ошибки подключения.

curl -fsS --retry 15 --retry-connrefused --retry-delay 1 http://localhost:8088/ws/v1/cluster/scheduler -o /home/hadoop/scheduler-fair.json
python3 - <<'PY'
import json
with open('/home/hadoop/scheduler-fair.json') as stream:
    info = json.load(stream)['scheduler']['schedulerInfo']
print(info['type'])
for queue in info['rootQueue']['childQueues']['queue']:
    if queue['queueName'] in ('root.citizens', 'root.priests'):
        resources = queue['minResources']
        print(queue['queueName'], resources['memory'], resources['vCores'])
PY

Ожидаемый результат (порядок очередей может отличаться):

fairScheduler
root.citizens 1024 1
root.priests 2048 2

Прежде чем переключать планировщики на этапе 3, проверьте, что на этом этапе получен ожидаемый результат.

Настройка Capacity Scheduler

На этом этапе вы переключитесь на Capacity Scheduler и выделите каждой очереди 50% ёмкости кластера.

Работая от имени пользователя Hadoop, запишите файл capacity-scheduler.xml непосредственно в каталог конфигурации Hadoop. Если сохранить файл только в /home/hadoop, планировщик не загрузит его:

cat > /home/hadoop/hadoop/etc/hadoop/capacity-scheduler.xml <<'XML'
<?xml version="1.0"?>
<configuration>
  <property>
    <name>yarn.scheduler.capacity.root.queues</name>
    <value>citizens,priests</value>
  </property>
  <property>
    <name>yarn.scheduler.capacity.root.citizens.capacity</name>
    <value>50</value>
  </property>
  <property>
    <name>yarn.scheduler.capacity.root.priests.capacity</name>
    <value>50</value>
  </property>
</configuration>
XML

Суммарная ёмкость дочерних очередей составляет 100%. Выберите Capacity Scheduler в yarn-site.xml:

sed -i 's/org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler/org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler/' /home/hadoop/hadoop/etc/hadoop/yarn-site.xml

Перезапустите ResourceManager, чтобы он загрузил новый класс планировщика и конфигурацию очередей:

yarn --daemon stop resourcemanager
yarn --daemon start resourcemanager

Проверьте активный планировщик и его очереди:

curl -fsS --retry 15 --retry-connrefused --retry-delay 1 http://localhost:8088/ws/v1/cluster/scheduler -o /home/hadoop/scheduler-capacity.json
python3 - <<'PY'
import json
with open('/home/hadoop/scheduler-capacity.json') as stream:
    info = json.load(stream)['scheduler']['schedulerInfo']
print(info['type'])
for queue in info['queues']['queue']:
    print(queue['queueName'], queue['capacity'])
PY

Ожидаемый результат (порядок очередей может отличаться):

capacityScheduler
citizens 50.0
priests 50.0

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

Итоги

В этой лабораторной работе вы узнали, как настраивать и применять разные политики планирования в Hadoop YARN для эффективного распределения ресурсов. Освоив Fair Scheduler и Capacity Scheduler, Аменхотеп сможет справедливо распределять ресурсы между жителями царства и отдавать приоритет важным задачам, которые выполняют жрецы.

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