Введение
В древнем Египте дворец фараона был великолепным свидетельством могущества и процветания царства. Однако за позолоченным фасадом назревал кризис. В огромных хранилищах фараона, наполненных дарами Нила, царил беспорядок. Жрецы, отвечавшие за распределение ресурсов, не справлялись с потребностями жителей.
На помощь пришёл Аменхотеп — одарённый молодой жрец, которому поручили навести порядок в распределении ресурсов царства. Ему предстояло разработать систему, которая обеспечила бы справедливое и эффективное распределение ценных запасов, чтобы каждый житель получил свою долю.
Фараон оценил ум и преданность Аменхотепа и предоставил ему доступ к новейшему технологическому чуду — системе 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 и его способностью управлять ресурсами в сложной среде. Применяя полученные знания, вы сможете создавать эффективные и справедливые системы управления ресурсами с учётом потребностей вашей организации.



