# MapReduce

MapReduce é um modelo de programação desenhado para processar grandes volumes de dados em paralelo, dividindo o trabalho em um conjunto de tarefas independentes. Programas MapReduce são escritos em um determinado estilo influenciado por construções de programação funcionais, especificamente expressões idiomáticas para listas de processamento de dados. Este módulo explica a natureza do presente modelo de programação e como ela pode ser usada para escrever programas que são executados no ambiente Hadoop.

## História

MapReduce é um modelo de programação, e framework introduzido pelo Google para suportar computações paralelas em grandes coleções de dados em clusters de computadores. O MapReduce passa a ser considerado um novo modelo computacional distribuído, inspirado pelas funções map e reduce usadas comumente em programação funcional. MapReduce é um “Data-Oriented” que processa dados em duas fases primárias: Map e Reduce.

## Fluxo de dados

A parte congelada do framework MapReduce é uma grande espécie distribuída. Os pontos quentes, que define a aplicação, são:
* um leitor de entrada
* uma função de Map
* uma função de partição
* uma função de comparação
* uma função Reduce
* um escritor de saída

### Leitor de Entrada

O leitor de entrada divide os dados em 'blocos' de tamanhos adequados (na prática, normalmente de 16 MB para 128 MB) e o framework atribui um bloco para cada função de mapeamento. O leitor lê os dados de entrada de um sistema de armazenamento estável (normalmente um sistema de arquivos distribuído ) e gera pares chave / valor. Um exemplo comum seria ler um diretório cheio de arquivos de texto e retornar cada linha como um registro.

### Função Map

A função Map, ou função de mapeamento, leva uma série de pares (chave / valor) processa cada um e gera zero ou mais (chave / valor) pares de saída. Os tipos de entrada e de saída do mapa podem ser (e geralmente são) diferentes umas das outras. Se o aplicativo está fazendo uma contagem de palavras, a função de mapa iria quebrar a linha em palavras e de saída de um par chave / valor para cada palavra. Cada par de saída deve conter a palavra como a chave e o número de ocorrências dessa palavra na linha como o valor.

### Função de partição

Cada resultado da função Map é alocada para um redutor determinado pela função de partição com propósitos de Sharding. A função de partição é dada a chave e o número de redutores e retorna o índice de reduzir o desejado. Um padrão típico é de hash a chave e use o valor de hash modulo o número de redutores. É importante escolher uma função de partição que dá uma distribuição aproximadamente uniforme de dados por caco para balanceamento de carga fins, caso contrário, a operação MapReduce pode ser realizada à espera de redutores lentos (redutores atribuído mais do que a sua quota de dados) para concluir. Entre o mapa e reduzir as fases, os dados são baralhados (paralelo-ordenadas / trocada entre os nós), a fim de mover os dados a partir do nó do mapa que produziu o fragmento em que ele vai ser reduzida. O shuffle às vezes pode demorar mais do que o tempo de computação, dependendo da largura de banda da rede, a velocidade da CPU, os dados produzidos e tempo gasto pelo mapa e reduzir cálculos.

### Função de comparação

A entrada para cada Reduce é retirado da máquina onde o Mapeamento ocorreu e classificados usando função de comparação do aplicativo.

### Função Reduce

O quadro chama Reduzir função da aplicação uma vez para cada chave única na ordem de classificação. O Reduce pode percorrer os valores que estão associados com a chave e produzir zero ou mais saídas. No exemplo a contagem de palavras, a função Reduce toma os valores de entrada, resume-os e gera uma única saída da palavra ea soma final.

### Escritor de saída

O escritor de saída escreve a saída do Reduce o armazenamento estável, geralmente um sistema de arquivos distribuídos.