Vídeo: 14 MAPREDUCE PARTITION EXAMPLE 2024
Um aplicativo MapReduce processa os dados em divisões de entrada em uma base record-by-record e que cada registro é entendido por MapReduce como uma chave / valor par. Depois que as divisões de entrada foram calculadas, as tarefas do mapeador podem começar a processá-las - ou seja, logo após a instalação de agendamento do Gerenciador de Recursos atribuir-lhes os recursos de processamento. (No Hadoop 1, o JobTracker atribui tarefas de mapeador a slots de processamento específicos.)
A própria tarefa do mapeador processa sua entrada dividir um registro por vez - na figura, esse registro solitário é representado pelo par de chaves / valores. No caso de nossos dados de voo, quando as divisões de entrada são calculadas (usando o método de processamento de arquivo padrão para arquivos de texto), a suposição é que cada linha no arquivo de texto é um registro único.
Para cada registro, o texto da própria linha representa o valor e o deslocamento de bytes de cada linha desde o início da divisão é considerado a chave.
Você pode estar se perguntando por que o número da linha não é usado em vez do deslocamento do byte. Quando você considera que um arquivo de texto muito grande é dividido em muitos blocos de dados individuais e é processado como muitas divisões, o número da linha é um conceito de risco.
O número de linhas em cada divisão varia, portanto, seria impossível calcular o número de linhas anteriores ao processado. No entanto, com o deslocamento de bytes, você pode ser preciso, porque cada bloco possui um número fixo de bytes.
Como uma tarefa de mapeador processa cada registro, gera um novo par de chave / valor: a chave e o valor aqui podem ser completamente diferentes do par de entrada. A saída da tarefa do mapeador é a coleção completa de todos esses pares chave / valor.
Antes de escrever o arquivo de saída final para cada tarefa do mapeador, a saída é particionada com base na chave e ordenada. Esse particionamento significa que todos os valores para cada chave são agrupados.
No caso do aplicativo de amostra bastante básico, existe apenas um único redutor, de modo que toda a saída da tarefa do mapeador é gravada em um único arquivo. Mas em casos com redutores múltiplos, cada tarefa de mapeador também pode gerar vários arquivos de saída.
A repartição desses arquivos de saída é baseada na chave de particionamento. Por exemplo, se houver apenas três chaves de particionamento distintas para as tarefas do mapeador e você configurou três redutores para o trabalho, haverá três arquivos de saída do mapeador. Neste exemplo, se uma tarefa de mapeador particular processa uma divisão de entrada e gera saída com duas das três chaves, haverá apenas dois arquivos de saída.
Comprime sempre os arquivos de saída de suas tarefas de mapeador. O maior benefício aqui é em ganhos de desempenho, porque escrever arquivos de saída menores minimiza o custo inevitável de transferir a saída do mapeador para os nós onde os redutores estão em execução.
O particionador padrão é mais do que adequado na maioria das situações, mas às vezes você pode querer personalizar a forma como os dados são particionados antes de serem processados pelos redutores. Por exemplo, você pode querer que os dados em seus conjuntos de resultados sejam classificados pela chave e seus valores - conhecidos como secundário ordenados.
Para fazer isso, você pode substituir o particionador padrão e implementar o seu próprio. Este processo requer algum cuidado, no entanto, porque você quer garantir que o número de registros em cada partição seja uniforme. (Se um redutor tiver que processar muito mais dados do que os outros redutores, você aguardará que seu trabalho MapReduce termine enquanto o redutor único sobrecarregado é slogging através de seu conjunto de dados desproporcionalmente grande.)
Usando arquivos intermediários de tamanho uniforme, você pode aproveitar melhor o paralelismo disponível no processamento MapReduce.