Introdução
Na antiga terra do Egito, o palácio do faraó era um magnífico símbolo do poder e da prosperidade do reino. Porém, sob sua superfície dourada, uma crise estava se formando. Os vastos armazéns do faraó, repletos das riquezas do Nilo, estavam em desordem. Os sacerdotes, responsáveis por distribuir os recursos, tinham dificuldade para atender às necessidades da população.
Foi então que Amenhotep, um jovem sacerdote brilhante, recebeu a missão de restabelecer a ordem na gestão dos recursos do reino. Ele precisava desenvolver um sistema que garantisse uma distribuição justa e eficiente dos bens preciosos, para que cada cidadão recebesse a parte que lhe cabia.
Impressionado com a inteligência e a dedicação de Amenhotep, o faraó lhe concedeu acesso a uma das mais recentes maravilhas tecnológicas: o sistema Hadoop YARN (Yet Another Resource Negotiator). Com essa poderosa ferramenta à sua disposição, Amenhotep começou a aprender os detalhes do Applying Scheduler, um componente essencial do YARN que o ajudaria a alcançar seu objetivo.
Conhecendo os escalonadores do Hadoop YARN
Nesta etapa, você vai conhecer as diferentes políticas de escalonamento disponíveis no Hadoop YARN e verificar qual escalonador está em execução.
Primeiro, alterne para o usuário hadoop. Execute todos os comandos deste laboratório neste terminal:
su - hadoop
Defina explicitamente o diretório de configuração. Nesta imagem, o Hadoop está instalado em /home/hadoop/hadoop; /etc/hadoop/conf não é usado.
export HADOOP_CONF_DIR=/home/hadoop/hadoop/etc/hadoop
O Hadoop YARN oferece o Fair Scheduler e o Capacity Scheduler. O Fair Scheduler distribui os recursos entre as aplicações ao longo do tempo, e os pesos das filas influenciam a parcela de recursos que cada uma recebe. O Capacity Scheduler reserva capacidades garantidas para as filas em uma hierarquia e permite compartilhar recursos que não estão sendo usados.
O Hadoop 3.3.6 não oferece o subcomando yarn scheduler. Para verificar qual escalonador está realmente em execução, consulte a API REST do ResourceManager, em vez de presumir que um arquivo de configuração foi aplicado. Salve a resposta:
curl -fsS --retry 15 --retry-connrefused --retry-delay 1 http://localhost:8088/ws/v1/cluster/scheduler -o /home/hadoop/scheduler-initial.json
Exiba o tipo de escalonador ativo:
python3 - <<'PY'
import json
with open('/home/hadoop/scheduler-initial.json') as stream:
info = json.load(stream)['scheduler']['schedulerInfo']
print(info['type'])
PY
Saída esperada em um ambiente de laboratório recém-iniciado:
capacityScheduler
Mantenha este terminal aberto para as próximas etapas. Vamos configurar cada escalonador por meio dos arquivos de configuração do Hadoop e reiniciar o ResourceManager para carregar a classe de escalonador selecionada.
Configurando o Fair Scheduler
Nesta etapa, você vai configurar o Fair Scheduler para compartilhar recursos entre as filas citizens e priests.
Como usuário hadoop, crie o arquivo de alocação executando este bloco inteiro:
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
A fila citizens tem peso 1 e um mínimo de 1024 MB de memória e 1 vcore. A fila priests tem peso 2 e um mínimo de 2048 MB de memória e 2 vcores. Os recursos mínimos são metas condicionadas à disponibilidade de recursos no cluster; os pesos influenciam a divisão dos recursos restantes.
Selecione o Fair Scheduler e indique o arquivo de alocação em yarn-site.xml. O comando a seguir preserva as configurações existentes do 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
Para alterar a classe do escalonador, é necessário reiniciar o ResourceManager. Este cluster de laboratório não tem aplicações em execução. Pare e inicie somente o ResourceManager:
yarn --daemon stop resourcemanager
yarn --daemon start resourcemanager
Consulte novamente o escalonador em execução. As opções de nova tentativa dão tempo para o ResourceManager iniciar; podem ocorrer breves erros de conexão durante a inicialização.
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
Saída esperada (a ordem das filas pode variar):
fairScheduler
root.citizens 1024 1
root.priests 2048 2
Conclua a verificação desta etapa antes de alternar os escalonadores na Etapa 3.
Configurando o Capacity Scheduler
Nesta etapa, você vai alternar para o Capacity Scheduler e atribuir 50% da capacidade do cluster a cada fila.
Como usuário hadoop, grave capacity-scheduler.xml diretamente no diretório de configuração do Hadoop. Se o arquivo ficar apenas em /home/hadoop, esse escalonador não vai carregá-lo:
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
As capacidades das filas filhas somam 100%. Selecione o Capacity Scheduler em 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
Reinicie o ResourceManager para carregar a nova classe de escalonador e a configuração das filas:
yarn --daemon stop resourcemanager
yarn --daemon start resourcemanager
Verifique o escalonador ativo e suas filas:
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
Saída esperada (a ordem das filas pode variar):
capacityScheduler
citizens 50.0
priests 50.0
Cada fila tem capacidade garantida de 50% quando ambas precisam de recursos. A capacidade não utilizada pode ser compartilhada; esses valores não obrigam o cluster a deixar recursos ociosos.
Resumo
Neste laboratório, aprendemos a configurar e aplicar diferentes políticas de escalonamento no Hadoop YARN para gerenciar a alocação de recursos com eficiência. Ao dominar o Fair Scheduler e o Capacity Scheduler, Amenhotep pode garantir uma distribuição justa de recursos entre os cidadãos do reino e dar prioridade às tarefas importantes realizadas pelos sacerdotes.
Com essa experiência prática, entendemos melhor os recursos avançados do Hadoop YARN e sua capacidade de gerenciar recursos em ambientes complexos. Ao aplicar os conhecimentos adquiridos neste laboratório, podemos criar sistemas eficientes e justos de gerenciamento de recursos, adaptados às necessidades específicas da nossa organização.



