Submeta e inspecione um trabalho em lote no YARN

Big DataBeginner
Pratique Agora

Introdução

Você acompanhou Map, Shuffle e Reduce e conferiu uma execução local real de WordCount. Agora, a empresa varejista quer aplicar a mesma regra de contagem a arquivos no HDFS, usando os serviços de gerenciamento de recursos do ambiente. A pergunta de negócio permanece igual; a organização do armazenamento e da execução muda.

O YARN gerencia recursos para aplicações. Seu ResourceManager coordena a alocação de recursos, enquanto um NodeManager gerencia a execução em uma máquina de trabalho. Cada aplicação submetida tem um ApplicationMaster para coordenar seu trabalho e executa trabalho em contêineres alocados, que são alocações de recursos com processos dentro delas. Esses contêineres do YARN não são necessariamente contêineres Docker.

Você submeterá o JAR WordCount preparado, identificará sua aplicação YARN real, inspecionará seu estado concluído e seus logs e conferirá os resultados no HDFS. Uma segunda execução usará outro caminho de saída para que a entrada original e o primeiro resultado permaneçam disponíveis. O laboratório prepara seus próprios dados e inicia os serviços; você não precisa dos arquivos do laboratório anterior nem de conhecimentos de programação Java. Use o Terminal.

Submeta o algoritmo conhecido ao YARN

Nesta etapa, você preparará a entrada no HDFS e submeterá o mesmo algoritmo WordCount usando o framework YARN configurado.

Comece no espaço de trabalho local:

cd /home/labex/project

Leia a entrada preparada:

cat /home/labex/project/data/product-words.txt

Estas são as mesmas seis linhas usadas para explicar o algoritmo. Os totais esperados continuam sendo folder=3, notebook=4 e pen=4. Crie um diretório bruto no HDFS com um diretório-pai separado para os resultados:

hdfs dfs -mkdir -p /user/labex/yarn-batch/raw /user/labex/yarn-batch/results

Envie a entrada:

hdfs dfs -put /home/labex/project/data/product-words.txt /user/labex/yarn-batch/raw/product-words.txt

Você já aprendeu que -put mantém o original local. O diretório raw do HDFS é a entrada do trabalho; results deve ficar fora dele para evitar a leitura de saídas anteriores como novas entradas.

O JAR de exemplo e o nome wordcount são os mesmos da execução local. Desta vez, omita as substituições de modo local: a configuração instalada usa mapreduce.framework.name=yarn e o sistema de arquivos padrão HDFS. Portanto, os dois argumentos finais abaixo são caminhos do HDFS. O trabalho cria seu próprio diretório de saída run-1, que ainda não deve existir:

hadoop jar /opt/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.5.0.jar wordcount /user/labex/yarn-batch/raw /user/labex/yarn-batch/results/run-1

Espere o comando terminar. Ele imprime um ID de aplicação submetida, seguido pelo progresso do trabalho e por uma mensagem de conclusão bem-sucedida. IDs de aplicação e de trabalho, tempos e ordem do progresso variam. Você não precisa capturar um estado RUNNING momentâneo; aplicações concluídas ainda podem ser inspecionadas.

Relacione o comando às funções:

Cliente submete a aplicação → ResourceManager aloca recursos
ApplicationMaster coordena o trabalho MapReduce → NodeManager executa contêineres
Tarefas leem entradas do HDFS → Tarefas gravam resultados no HDFS

Este ainda é um ambiente de aprendizagem em uma única máquina. As funções do YARN são reais, embora seus processos compartilhem uma máquina. A seguir, você solicitará ao YARN evidências diretas de que a aplicação foi concluída com sucesso.

Inspecione a aplicação concluída

Nesta etapa, você guardará o ID real da aplicação e o usará para consultar o estado e os logs agregados.

O YARN atribui um ID de aplicação (Application ID) quando aceita uma aplicação. Ele é diferente de um caminho do HDFS ou de um nome de arquivo de resultado. Liste todos os estados de aplicação, incluindo aplicações concluídas:

yarn application -list -appStates ALL

Este ambiente novo tem uma aplicação submetida. Seu tipo deverá ser MAPREDUCE, seu estado FINISHED e seu status final SUCCEEDED. FINISHED, sozinho, não prova sucesso: o status final também importa.

Salve o ID real da aplicação sem copiar um valor de um exemplo. O pipeline a seguir usa grep -o para imprimir apenas uma parte correspondente. Neste padrão, [0-9]* corresponde às sequências de dígitos em um ID de aplicação:

yarn application -list -appStates ALL | grep -o 'application_[0-9]*_[0-9]*' > /home/labex/project/output/application-id.txt

Leia o ID coletado:

cat /home/labex/project/output/application-id.txt

Você deverá ver uma linha começando com application_. O restante é atribuído por este ambiente; não use o ID de outra pessoa.

Para inserir esse valor salvo em um comando, $(cat ...) executa cat e substitui a expressão por sua saída. Aspas duplas mantêm o valor substituído junto como um único argumento. Consulte essa aplicação real:

yarn application -status "$(cat /home/labex/project/output/application-id.txt)"

Localize State, Final-State e Application-Type. Espere FINISHED, SUCCEEDED e MAPREDUCE. Salve o relatório:

yarn application -status "$(cat /home/labex/project/output/application-id.txt)" > /home/labex/project/output/application-status.txt

O YARN também reúne logs de contêineres. O comando logs -applicationId os lê para a aplicação selecionada. Salve os logs localmente para inspecionar uma parte de tamanho administrável:

yarn logs -applicationId "$(cat /home/labex/project/output/application-id.txt)" > /home/labex/project/output/application.log

Use o comando local tail -n 20 para exibir as últimas vinte linhas:

tail -n 20 /home/labex/project/output/application.log

As mensagens exatas dos logs variam. Cabeçalhos de contêineres e mensagens de tarefas relacionam a aplicação ao trabalho que o YARN realmente executou. Os logs ajudam a explicar o comportamento; o estado bem-sucedido junto com a saída de negócio correta é uma evidência mais forte que uma única linha tranquilizadora de log. No próximo laboratório, você usará essas mesmas ferramentas de diagnóstico em falhas.

Valide e execute novamente sem contaminar a entrada

Nesta etapa, você conferirá os dados do resultado, os exportará e executará novamente usando um segundo caminho de saída.

Liste o primeiro diretório de resultado:

hdfs dfs -ls /user/labex/yarn-batch/results/run-1

O marcador _SUCCESS indica saída concluída. Os arquivos part-* contêm as contagens. Como antes, use um padrão do HDFS entre aspas e ordene os registros para uma inspeção estável:

hdfs dfs -cat '/user/labex/yarn-batch/results/run-1/part-*' | sort

Resultado esperado:

folder 3
notebook 4
pen 4

Salve uma exportação local ordenada usando a técnica de leitura de volta:

hdfs dfs -cat '/user/labex/yarn-batch/results/run-1/part-*' | sort > /home/labex/project/output/run-1-counts.txt

Antes da próxima execução, preveja se outra execução sobre uma entrada idêntica deverá mudar as contagens. Não deverá. Um novo caminho de saída mantém o primeiro resultado e evita o erro de saída já existente:

hadoop jar /opt/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.5.0.jar wordcount /user/labex/yarn-batch/raw /user/labex/yarn-batch/results/run-2

Após a conclusão bem-sucedida, leia e salve as contagens ordenadas da segunda execução:

hdfs dfs -cat '/user/labex/yarn-batch/results/run-2/part-*' | sort > /home/labex/project/output/run-2-counts.txt

Compare as duas exportações locais:

diff /home/labex/project/output/run-1-counts.txt /home/labex/project/output/run-2-counts.txt

Nenhuma diferença deverá aparecer. Os resultados ficam em diretórios irmãos fora do diretório de entrada bruta, portanto executar novamente não adicionou a saída anterior ao próximo lote de entrada. Agora você conferiu uma aplicação real, seus logs, seus dados de resultado e um comportamento repetível sem mudar o algoritmo.

Resumo

Você levou um algoritmo de contagem conhecido da execução local para o HDFS e o YARN. Identificou uma aplicação MapReduce real, inspecionou sua conclusão bem-sucedida e os logs de contêineres e conferiu resultados corretos em dois caminhos de saída.

O algoritmo não mudou, enquanto sua organização de armazenamento e gerenciamento de recursos mudou. A seguir, você aprenderá a distinguir problemas do lado do cliente de falhas de uma aplicação já submetida e a fazer o menor reparo adequado.