Um dos principais exemplos usados para demonstrar o poder do MapReduce é o benchmark Terasort . Estou tendo problemas para entender os fundamentos do algoritmo de classificação usado no ambiente MapReduce.
Para mim, a classificação envolve simplesmente determinar a posição relativa de um elemento em relação a todos os outros elementos. Assim, a classificação envolve comparar "tudo" com "tudo". Seu algoritmo de classificação médio (rápido, bolha, ...) simplesmente faz isso de maneira inteligente.
Na minha opinião, dividir o conjunto de dados em muitas partes significa que você pode classificar uma única parte e, então, ainda terá que integrar essas partes no conjunto de dados totalmente classificado "completo". Dado o conjunto de dados de terabytes distribuídos em milhares de sistemas, espero que seja uma tarefa gigantesca.
Então, como isso é realmente feito? Como funciona esse algoritmo de classificação MapReduce?
Obrigado por me ajudar a entender.
Eu tive a mesma pergunta enquanto lia o artigo MapReduce do Google. A resposta de @Yuval F praticamente resolveu meu quebra-cabeça.
Uma coisa que notei ao ler o jornal é que a mágica acontece no particionamento (depois do mapa, antes de reduzir).
O papel usa
hash(key) mod R
como exemplo de particionamento, mas esta não é a única maneira de particionar dados intermediários para diferentes tarefas de redução.Basta adicionar condições de contorno para @Yuval F 's resposta para completá-lo: min supõem (S) e max (S) é a chave mínimo e máximo da chave entre as chaves amostrados; todas as chaves <min (S) são particionadas em uma tarefa de redução; vice-versa, todas as chaves> = max (S) são particionadas em uma tarefa de redução.
Não há limitação rígida nas chaves de amostra, como mín ou máx. Apenas, mais uniformemente essas chaves R distribuídas entre todas as chaves, mais "paralelo" este sistema distribuído é e menos provável que um operador de redução tenha problema de estouro de memória.
fonte
Apenas adivinhando...
Dado um grande conjunto de dados, você particionaria os dados em alguns blocos para serem processados em paralelo (talvez pelo número do registro, ou seja, registro 1 - 1000 = partição 1 e assim por diante).
Atribua / agende cada partição a um nó específico no cluster.
Cada nó do cluster irá dividir (mapear) a partição em sua própria minipartição, talvez pela ordem alfabética principal. Então, na partição 1, pegue todas as coisas que começam com A e produza na minipartição A de x. Crie um novo A (x) se atualmente já houver um A (x). Substitua x pelo número sequencial (talvez este seja o trabalho do planejador para fazer isso). Ie Dê-me o próximo A (x) id exclusivo.
Transfira (agende) os trabalhos concluídos pelo mapeador (etapa anterior) para os nós de cluster "reduzir". Reduzir o cluster de nós irá então refinar ainda mais o tipo de cada parte A (x) que acontecerá somente quando todas as tarefas do mapeador forem concluídas (não é possível começar a classificar todas as palavras começando com w / A quando ainda há possibilidade de que ainda haja vai ser outra partição A mini em construção). Produza o resultado na partição final classificada (ou seja, Sorted-A, Sorted-B, etc.)
Uma vez feito isso, combine a partição classificada em um único conjunto de dados novamente. Neste ponto, é apenas uma simples concatenação de n arquivos (onde n pode ser 26 se você estiver apenas fazendo A - Z), etc.
Pode haver etapas intermediárias entre ... Não tenho certeza :). Ou seja, mapeie e reduza ainda mais após a etapa de redução inicial.
fonte