Qual é a finalidade da fase de embaralhamento e classificação no redutor na Programação Map Reduce?


113

Na programação do Map Reduce, a fase de redução tem embaralhamento, classificação e redução como suas sub-partes. A classificação é um assunto caro.

Qual é a finalidade da fase de embaralhamento e classificação no redutor na Programação Map Reduce?


3
Sempre presumi que isso era necessário, pois a saída do mapeador é a entrada para o redutor, então ela foi classificada com base no keyspace e, em seguida, dividida em depósitos para cada entrada do redutor.
BasicHorizon

Respostas:


171

Em primeiro lugar, shufflingé o processo de transferência de dados dos mapeadores para os redutores, então eu acho que é óbvio que é necessário para os redutores, pois caso contrário, eles não seriam capazes de ter nenhuma entrada (ou entrada de cada mapeador) . O embaralhamento pode começar antes mesmo de a fase do mapa terminar, para economizar algum tempo. É por isso que você pode ver um status de redução maior que 0% (mas menor que 33%) quando o status do mapa ainda não é 100%.

Sortingeconomiza tempo para o redutor, ajudando-o a distinguir facilmente quando uma nova tarefa de redução deve ser iniciada. Ele simplesmente inicia uma nova tarefa de redução, quando a próxima chave nos dados de entrada classificados for diferente da anterior, para simplificar. Cada tarefa de redução leva uma lista de pares de valores-chave, mas tem que chamar o método reduce () que usa uma entrada de lista de chaves (valor), então tem que agrupar os valores por chave. É fácil fazer isso, se os dados de entrada forem pré-classificados (localmente) na fase de mapa e simplesmente classificados por mesclagem na fase de redução (já que os redutores obtêm dados de muitos mapeadores).

Partitioning, que você mencionou em uma das respostas, é um processo diferente. Determina em qual redutor será enviado um par (chave, valor), saída da fase do mapa. O Particionador padrão usa um hash nas chaves para distribuí-las para as tarefas de redução, mas você pode substituí-lo e usar seu próprio Particionador personalizado.

Uma ótima fonte de informações para essas etapas é este tutorial do Yahoo .

Uma bela representação gráfica disso é a seguinte (o shuffle é chamado de "cópia" nesta figura):

insira a descrição da imagem aqui

Observe que shufflinge sortingnão são executados se você especificar redutores zero (setNumReduceTasks (0)). Então, o trabalho MapReduce para na fase do mapa, e a fase do mapa não inclui nenhum tipo de classificação (portanto, mesmo a fase do mapa é mais rápida).

ATUALIZAÇÃO: Já que você está procurando por algo mais oficial, também pode ler o livro "Hadoop: The Definitive Guide" de Tom White. Aqui está a parte interessante da sua pergunta.
Tom White é um committer do Apache Hadoop desde fevereiro de 2007 e é membro da Apache Software Foundation, então eu acho que é bastante confiável e oficial ...


"A classificação economiza tempo para o redutor, ajudando-o a distinguir facilmente quando uma nova tarefa de redução deve ser iniciada. Simplesmente inicia uma nova tarefa de redução, quando a próxima chave nos dados de entrada classificados é diferente da anterior, para simplificar." Eu não entendo essa parte. O mapeador usa um particionador para dividir locais em partições, cada partição então enviada para uma redução. Como a classificação ajuda aqui?
MaxNevermind

1
@MaxNevermind Se você tiver x tarefas de redução (partições), isso não significa que você acabará chamando o método reduz () x vezes. Ele será chamado uma vez para cada chave distinta. Portanto, uma tarefa de redução pode chamar o método reduz () várias vezes.
vefthym

"Será chamado uma vez para cada chave distinta" Por quê? O mapeador forma partições da maneira que quiser (não é necessária uma partição para cada chave distinta), então cada partição vai para o redutor, está errado?
MaxNevermind

1
@MaxNevermind Mapper gera chaves e valores, não forma partições. As partições são definidas pelo número de tarefas de redução que o usuário define e a implementação do Particionador. As saídas de todos os mapeadores que têm a mesma chave irão para o mesmo método reduce (). Isso não pode ser alterado. Mas o que pode ser alterado é quais outras chaves (se houver) serão colocadas na mesma partição e, portanto, serão tratadas pela mesma tarefa. Uma tarefa de redução pode chamar a função reduz () mais de uma vez, mas apenas uma vez para cada tecla.
vefthym

2
ok eu acho que entendi. Meu problema é que esqueci que reduzir leva uma lista de valores como argumento, não apenas um par de valores-chave. Acho que você deve elaborar isso em sua resposta: "Cada tarefa de redução leva uma lista de pares de valores-chave, mas tem que chamar o método de redução que usa uma Lista-chave <valor>, então tem que agrupar valores por chave, é fácil a fazer se os dados de entrada forem pré-classificados em um estágio de mapeamento "
MaxNevermind

42

Vamos revisitar as principais fases do programa Mapreduce.

A fase do mapa é feita por mapeadores. Os mapeadores são executados em pares chave / valores de entrada não classificados. Cada mapeador emite zero, um ou vários pares de chave / valor de saída para cada par de chave / valor de entrada.

A fase de combinação é feita por combinadores. O combinador deve combinar pares de chave / valor com a mesma chave. Cada combinador pode executar zero, uma ou várias vezes.

A fase de embaralhamento e classificação é feita pela estrutura. Os dados de todos os mapeadores são agrupados pela chave, divididos entre redutores e classificados pela chave. Cada redutor obtém todos os valores associados à mesma chave. O programador pode fornecer funções de comparação personalizadas para classificação e um particionador para divisão de dados.

O particionador decide qual redutor obterá um par de valores-chave específico.

O redutor obtém pares de chave / [lista de valores] classificados, classificados pela chave. A lista de valores contém todos os valores com a mesma chave produzida por mapeadores. Cada redutor emite zero, um ou vários pares de chave / valor de saída para cada par de chave / valor de entrada .

Dê uma olhada neste artigo javacodegeeks de Maria Jurcovicova e no artigo mssqltips de Datta para uma melhor compreensão

Abaixo está a imagem do artigo safaribooksonline

insira a descrição da imagem aqui


Acho que há um erro de digitação na imagem (que percebi que acabou de ser copiado aqui). Eu acredito que as iecordas em Redutores e Saída deveriam realmente ser is.
Jeff Evans

32

Pensei apenas em adicionar alguns pontos que faltam nas respostas acima. Este diagrama retirado daqui afirma claramente o que realmente está acontecendo.

insira a descrição da imagem aqui

Se eu declarar novamente o verdadeiro propósito de

  • Divisão: melhora o processamento paralelo, distribuindo a carga de processamento entre nós diferentes (mapeadores), o que economizaria o tempo de processamento geral.

  • Combinar: reduz a saída de cada mapeador. Isso economizaria tempo gasto para mover os dados de um nó para outro.

  • Sort (Shuffle & Sort): torna mais fácil para o tempo de execução agendar (spawn / start) novos redutores, onde ao percorrer a lista de itens classificados, sempre que a chave atual for diferente da anterior, ela pode gerar um novo redutor .


Onde a etapa de partição entraria neste gráfico? Depois do mapa e antes da combinação?
Joel

@Joel, espero que você se refira à etapa de 'divisão'.
Supun Wijerathne

Não, quero dizer a etapa de partição, ela decide para qual redutor enviar os dados, usando um módulo de hash simples por padrão, depois de mais algumas pesquisas, acredito que venha após a etapa de combinação, antes de embaralhar e classificar.
Joel

1
@Joel Não estou muito certo do que você pretende descrever. Em suma, a sequência exata de etapas pode ser muito específica para o problema. Posso dizer que, para alguns cenários, nem mesmo a classificação é necessária. Voltando à sua entrada, se eu falar especificamente sobre o exemplo simples de contagem de palavras acima, realmente não vejo nenhuma necessidade de tal particionamento para decidir os redutores. Aqui é bastante simples gerar reduções por chave. Mas posso supor que seu ponto pode ser válido para alguns cenários. Francamente, não tenho uma ideia exata sobre isso.
Supun Wijerathne

4

Alguns dos requisitos de processamento de dados não precisam de classificação. O Syncsort tornou a classificação no Hadoop plugável. Aqui está um bom blog deles sobre classificação. O processo de mover os dados dos mapeadores para os redutores é chamado de embaralhamento, consulte este artigo para obter mais informações sobre o mesmo.


2

Sempre presumi que isso era necessário, pois a saída do mapeador é a entrada para o redutor, então ela foi classificada com base no keyspace e então dividida em depósitos para cada entrada do redutor. Você quer garantir que todos os mesmos valores de uma chave acabem no mesmo balde indo para o redutor, de forma que sejam reduzidos juntos. Não adianta enviar K1, V2 e K1, V4 para redutores diferentes, pois eles precisam estar juntos para serem reduzidos.

Tentei explicar da forma mais simples possível


Se quisermos enviar k1, v1 e k1, v4 para o mesmo redutor, podemos embaralhar. então qual é o propósito da classificação?
Nithin K Anil

Ele faz a classificação por vários motivos, um dos quais é, quando um trabalho MapReduce está enviando todos os pares KV para um redutor, se a entrada não for classificada. Ele teria que varrer todas as saídas do mapeador para pegar cada instância de K1, VX . Considerando que, se a saída do Mapeador for classificada assim que K2, VX for captado, você saberá que todos K1, VX foram selecionados e esse conjunto pode ser enviado a um redutor para processamento, a vantagem disso é que você não tem que esperar que cada redutor esteja pronto para que cada um comece a reduzir.
BasicHorizon

Além disso, quando se trata de agregação, se você especificar que deseja agregar todos os K1, V1 se a entrada para o redutor for classificada assim que o redutor for ativado em K2, V2 ele saberá que não existem mais instâncias de K1, V1 ele pode terminar sua agregação, enquanto se a entrada do redutor não for classificada, ele terá que varrer toda a entrada para K1, V1
BasicHorizon

2

O embaralhamento é o processo pelo qual os dados intermediários dos mapeadores são transferidos para 0,1 ou mais redutores. Cada redutor recebe 1 ou mais chaves e seus valores associados dependendo do número de redutores (para uma carga balanceada). Além disso, os valores associados a cada chave são classificados localmente.


0

O MapReduce faz apenas duas coisas NATIVELMENTE: Classificar e (implementado por classificação) GroupBy escalável.

A maioria dos aplicativos e Design Patterns sobre MapReduce são construídos sobre essas duas operações, que são fornecidas por shuffle e sort.


0

Esta é uma boa leitura. Espero que ajude. Em termos de classificação, acho que é para a operação de mesclagem na última etapa do Mapa. Quando a operação de mapa for concluída e precisar gravar o resultado no disco local, uma mesclagem múltipla será operada nas divisões geradas do buffer. E para uma operação de mesclagem, classificar cada partição em avançado é útil.


0

Bem, no Mapreduce há duas frases importantes chamadas Mapeador e redutor, ambas muito importantes, mas Redutor é obrigatório. Em alguns programas, os redutores são opcionais. Agora vamos à sua pergunta. Embaralhar e classificar são duas operações importantes no Mapreduce. A primeira estrutura Hadoop pega dados estruturados / não estruturados e separa os dados em Chave, Valor.

Agora o programa Mapper separa e organiza os dados em chaves e valores a serem processados. Gere os valores da chave 2 e do valor 2. Esses valores devem ser processados ​​e reorganizados na ordem adequada para obter a solução desejada. Agora, esse embaralhamento e classificação são feitos em seu sistema local (o Framework cuida disso) e o processo no sistema local após a limpeza do framework do processo no sistema local. Está bem

Aqui, usamos combinador e partição também para otimizar esse processo de embaralhamento e classificação. Após o arranjo adequado, esses valores-chave passam para o Redutor para obter a saída desejada do Cliente. Finalmente, o Redutor obtém a saída desejada.

K1, V1 -> K2, V2 (escreveremos o programa Mapper), -> K2, V '(aqui embaralhe e suavize os dados) -> K3, V3 Gere a saída. K4, V4.

Observe que todas essas etapas são apenas operações lógicas, não alteram os dados originais.

Sua pergunta: Qual é o propósito da fase de embaralhamento e classificação no redutor na Programação Map Reduce?

Resposta curta: Para processar os dados para obter a saída desejada. O embaralhamento é agregar os dados, reduzir é obter a saída esperada.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.