Entenda Map, Shuffle e Reduce

Big DataBeginner
Pratique Agora

Introdução

Os arquivos de produtos da empresa varejista estão organizados e acessíveis. Agora você pode responder à pergunta do primeiro laboratório: quais rótulos de produtos aparecem com mais frequência? Você poderia contar algumas linhas manualmente, mas uma coleção crescente precisa de um cálculo repetível.

MapReduce é uma forma de organizar um cálculo em lote. Map transforma registros de entrada em pares de chave e valor; Shuffle reúne valores com a mesma chave; Reduce combina os valores de cada chave em um resultado. Para o WordCount, a chave é um rótulo de produto e cada ocorrência contribui com o valor 1. A contagem de palavras é um pequeno exemplo usado para tornar o fluxo de dados visível, em vez de um sistema completo de análise de vendas.

Você inspecionará essas fases com uma ferramenta didática preparada e executará um programa Hadoop WordCount real e pré-compilado sobre a mesma entrada. A ferramenta didática imprime as fases do algoritmo em um único processo; ela não é um rastreamento de execução distribuída. A execução do Hadoop usa o modo local para que você se concentre no cálculo antes de levar o mesmo algoritmo ao YARN no próximo laboratório. Não é necessário programar em Java ou Python.

Transforme rótulos de produtos em pares de chave e valor

Nesta etapa, você inspecionará a entrada e acompanhará cada ocorrência de produto na fase Map.

Comece no espaço de trabalho local:

cd /home/labex/project

Leia as seis linhas de entrada:

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

Texto esperado:

notebook pen
notebook folder
pen pen
folder notebook
notebook
folder pen

Pare e conte um produto manualmente. notebook aparece em quatro linhas, uma vez em cada; pen aparece quatro vezes no total, incluindo duas vezes na terceira linha. folder aparece três vezes. O programa deverá produzir esses mesmos totais.

Um par de chave e valor associa um rótulo a um valor. Neste algoritmo, Map emite (produto, 1) para cada ocorrência. Duas ocorrências de pen criam dois pares separados, em vez de um par por linha de entrada.

O executável wordcount-stages fornecido aceita um nome de fase e um arquivo local de entrada. Use sua visualização map:

/home/labex/project/tools/wordcount-stages map /home/labex/project/data/product-words.txt

A saída começa com:

notebook 1
pen 1
notebook 1
folder 1

O espaço entre cada chave e valor é uma tabulação. Há onze pares, um para cada ocorrência de produto. Esta ferramenta torna o algoritmo visível; ela não inicia serviços do Hadoop nem agenda tarefas. Colete a saída da fase:

/home/labex/project/tools/wordcount-stages map /home/labex/project/data/product-words.txt > /home/labex/project/output/map-pairs.txt

Você mudou a representação da entrada: linhas inteiras se tornaram contribuições que podem ser agrupadas por produto.

Agrupe e reduza as contribuições

Nesta etapa, você acompanhará os pares nas fases Shuffle e Reduce e relacionará a saída à sua previsão manual.

Map emite contribuições separadas. Para totalizar um produto, suas contribuições precisam se reunir. Shuffle e ordenação organizam pares por chave para que um redutor receba os valores de um produto específico. Em um trabalho distribuído, isso pode envolver transferência de dados entre tarefas; a ferramenta didática apenas exibe os valores agrupados.

Inspecione a visualização agrupada:

/home/labex/project/tools/wordcount-stages shuffle /home/labex/project/data/product-words.txt

Valores agrupados esperados:

folder 1,1,1
notebook 1,1,1,1
pen 1,1,1,1

As chaves estão ordenadas. Cada 1 separado por vírgula ainda representa uma ocorrência original, não um novo registro. Salve o agrupamento:

/home/labex/project/tools/wordcount-stages shuffle /home/labex/project/data/product-words.txt > /home/labex/project/output/shuffled-values.txt

Reduce combina os valores de cada chave. Aqui, ele soma os inteiros. Outra aplicação poderia combinar valores de outra forma; MapReduce não se limita à contagem.

Inspecione a visualização reduzida:

/home/labex/project/tools/wordcount-stages reduce /home/labex/project/data/product-words.txt

Resultados esperados:

folder 3
notebook 4
pen 4

Compare esses valores com as contagens manuais da etapa 1. Salve o resultado para compará-lo com a aplicação real do Hadoop a seguir:

/home/labex/project/tools/wordcount-stages reduce /home/labex/project/data/product-words.txt > /home/labex/project/output/teaching-counts.txt

O resultado depende de todas as ocorrências de cada chave, mesmo quando as ocorrências originais estavam em linhas diferentes. É por isso que a fase de agrupamento fica entre o mapeamento e a redução.

Execute o programa real Hadoop WordCount

Nesta etapa, você executará a mesma tarefa de contagem com um exemplo pré-compilado do Hadoop em modo local.

Um JAR empacota código de programa Java. O Hadoop e seu JAR de exemplos já estão instalados, portanto você não precisa compilar código. hadoop jar executa o JAR informado; wordcount seleciona seu exemplo WordCount. As duas configurações -D abaixo selecionam o framework de execução local e o sistema de arquivos local para esta chamada. Os dois últimos argumentos são o arquivo de entrada e um novo diretório de saída:

hadoop jar /opt/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.5.0.jar wordcount -Dmapreduce.framework.name=local -Dfs.defaultFS=file:/// /home/labex/project/data/product-words.txt /home/labex/project/output/local-wordcount

Espere o prompt. O Hadoop imprime mensagens de progresso e diagnóstico; caminhos, identificadores e tempos variam. Este é um programa real do Hadoop usando o executor local, em vez de uma aplicação YARN. O laboratório não inicia serviços HDFS nem YARN, e tanto a entrada quanto a saída são locais.

Liste o diretório local de saída:

ls /home/labex/project/output/local-wordcount

Você deverá ver um marcador _SUCCESS e um arquivo de resultado part-.... _SUCCESS indica a conclusão bem-sucedida da saída, enquanto o arquivo de resultado contém os dados que você deve conferir. O padrão part-* do shell local seleciona os arquivos de resultado. Passe seu conteúdo combinado por sort para tornar a comparação estável:

cat /home/labex/project/output/local-wordcount/part-* | sort > /home/labex/project/output/hadoop-counts.txt

Compare-os com as contagens da ferramenta didática:

diff /home/labex/project/output/teaching-counts.txt /home/labex/project/output/hadoop-counts.txt

Nenhuma diferença deverá aparecer. Você relacionou o algoritmo explicado à saída real de um programa. Se o diretório de saída desta execução já existir, inspecione seus arquivos concluídos em vez de excluí-lo às cegas ou presumir que uma nova submissão os sobrescreverá.

Uma distinção será importante mais adiante: um bloco do HDFS armazena bytes, uma divisão de entrada (input split) descreve uma unidade de trabalho de entrada, e uma tarefa (task) executa trabalho. Esses conceitos estão relacionados, mas nem sempre correspondem um a um. Arquivos de resultado são saídas de tarefas de processamento, não cópias dos blocos de armazenamento originais.

Preveja e teste uma alteração na entrada

Nesta etapa, você adicionará uma ocorrência de produto a uma cópia de trabalho e testará qual resultado muda.

Mantenha a entrada bruta somente de leitura inalterada. Use o cat local com > para gravar uma nova cópia de trabalho gravável. Ambos os caminhos aqui são locais; o arquivo de saída será aquele que você alterará:

cat /home/labex/project/data/product-words.txt > /home/labex/project/output/changed-product-words.txt

Preveja as novas contagens se você acrescentar uma ocorrência de notebook: apenas seu total deverá aumentar, de 4 para 5. printf imprime o texto fornecido, \n significa uma quebra de linha e >> acrescenta a saída em vez de substituir o conteúdo existente:

printf 'notebook\n' >> /home/labex/project/output/changed-product-words.txt

Inspecione a entrada alterada:

cat /home/labex/project/output/changed-product-words.txt

Deverá haver uma nova linha final. Execute o mesmo programa Hadoop alterando apenas os caminhos de entrada e saída:

hadoop jar /opt/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.5.0.jar wordcount -Dmapreduce.framework.name=local -Dfs.defaultFS=file:/// /home/labex/project/output/changed-product-words.txt /home/labex/project/output/changed-wordcount

Leia os resultados reais em ordem:

cat /home/labex/project/output/changed-wordcount/part-* | sort

Resultados esperados:

folder 3
notebook 5
pen 4

O novo par de Map pertence ao grupo notebook, portanto apenas esse total de Reduce muda. Agora você consegue explicar o resultado, em vez de apenas reconhecer um comando bem-sucedido. No próximo laboratório, o algoritmo e as regras de contagem permanecerão iguais, enquanto o HDFS fornecerá a entrada e o YARN gerenciará os recursos de execução.

Resumo

Você acompanhou ocorrências de produtos até pares de Map, agrupou valores com Shuffle e os combinou com Reduce. Os resultados reais do Hadoop WordCount corresponderam ao seu cálculo manual e à ferramenta didática e mudaram da forma prevista quando uma ocorrência foi adicionada à entrada.

Você usou o executor local para isolar o algoritmo. A seguir, manterá esse algoritmo e aprenderá como uma aplicação YARN real lê entradas do HDFS e produz resultados no HDFS.