YARN (Yet Another Resource Negotiator) é o gerenciador de recursos do ecossistema Hadoop. Quando o Spark roda em YARN, ele delega toda a alocação de CPU e memória para o YARN e só se preocupa com a lógica da aplicação.
Três componentes
ResourceManager roda em um único nó e é o árbitro central do cluster. Ele recebe os pedidos de recursos das aplicações e decide quem recebe o quê, com base na capacidade disponível e na política de fila configurada.
NodeManager roda em cada nó worker. Ele executa os containers alocados pelo ResourceManager, monitora o uso de CPU e memória de cada container e reporta o estado de volta ao ResourceManager.
ApplicationMaster é instanciado uma vez por aplicação. No Spark, o driver assume esse papel: ele negocia com o ResourceManager para obter containers para os Executors e os libera quando a aplicação termina.
flowchart TD RM["ResourceManager\n(nó master)"] subgraph NM1["Worker Node 1"] NM1P["NodeManager"] C1["Container\nExecutor 1"] end subgraph NM2["Worker Node 2"] NM2P["NodeManager"] C2["Container\nExecutor 2"] end AM["ApplicationMaster\n(Driver do Spark)"] AM -->|"pede containers"| RM RM -->|"aloca"| NM1P & NM2P NM1P --> C1 NM2P --> C2 C1 & C2 -->|"reporta progresso"| AM NM1P & NM2P -->|"heartbeat"| RM
Modos de deploy
Modo client: o Driver (e portanto o ApplicationMaster) roda na máquina que submete o job. Útil para desenvolvimento porque os logs aparecem diretamente no terminal. O problema é que a aplicação inteira fica dependente da conectividade dessa máquina.
spark-submit \
--master yarn \
--deploy-mode client \
meu_job.pyModo cluster: o Driver roda dentro de um container no cluster. É o padrão para produção porque o job sobrevive mesmo que a máquina cliente se desconecte.
spark-submit \
--master yarn \
--deploy-mode cluster \
--executor-memory 4g \
--executor-cores 2 \
--num-executors 10 \
meu_job.pyFilas e isolamento
O YARN organiza recursos em filas hierárquicas. Em ambientes multiusuário, cada time ou pipeline vai para uma fila com limites de CPU e memória configurados pelo administrador do cluster. Um job não pode consumir recursos além do que a fila permite, mesmo que o cluster tenha capacidade ociosa em outras filas (a menos que preemption esteja habilitado).
Exemplo: uma fila engenharia com 40% dos recursos do cluster garante que jobs de engenharia de dados nunca prejudiquem pipelines críticos que rodam na fila producao.
Quando usar YARN hoje
YARN faz sentido quando o cluster já roda Hadoop e há outros serviços do ecossistema (Hive, HBase, Impala) compartilhando os mesmos nós. Em ambientes cloud-native sem Hadoop, Kubernetes é a escolha mais comum. Ver spark-arquitetura para a comparação com os outros Cluster Managers.
Conexões
- spark-arquitetura: visão geral do Driver, Executor e Cluster Manager no Spark
- spark-mesos: alternativa ao YARN com modelo de agendamento diferente
- spark-performance: configurações de memória e executor que interagem com o YARN