Como é que o Hadoop efectua separações de entrada?

Esta é uma questão conceptual que envolve Hadoop/HDFS. Digamos que tem um ficheiro com mil milhões de linhas. E por uma questão de simplicidade, vamos considerar que cada linha é do formulário <k,v> onde k é o deslocamento da linha desde o início e o valor é o conteúdo da linha.

Agora, quando dizemos que queremos executar n map tasks, o framework divide o ficheiro de entrada em N splits e executa cada tarefa de mapa nessa divisão? ou temos de escrever um função de particionamento que faz o N dividir e executar cada tarefa de mapa na divisão gerada?

Tudo o que quero saber é se as divisões são feitas internamente ou se temos de dividir os dados manualmente?

mais especificamente, cada vez que a função map() é chamada quais são os seus parâmetros Key key and Value val?

Obrigado., Deepak

Author: Ravindra babu, 2010-05-14

10 answers

O InputFormat é responsável por fornecer as parcelas.

Em geral, se tiver n Nós, o HDFS irá distribuir o ficheiro por todos estes n Nós. Se você começar um trabalho, haverá n mappers por padrão. Graças ao Hadoop, o mapeador em uma máquina processará a parte dos dados que é armazenada neste nó. Acho que isto se chama Rack awareness.

Então, para resumir uma longa história, Upload os dados nos HDFS e iniciar um trabalho de MR. Hadoop cuidará da execução otimizada.
 25
Author: Peter Wippermann, 2010-05-14 13:37:14

Os ficheiros são divididos em blocos HDFS e os blocos são replicados. Hadoop atribui um nó para uma divisão baseada no princípio de localidade de dados. O Hadoop irá tentar executar o mapeador nos nós onde o bloco reside. Por causa da replicação, existem vários tais nós hospedando o mesmo bloco.

Caso os nós não estejam disponíveis, o Hadoop irá tentar escolher um nó que esteja mais próximo do nó que hospeda o bloco de dados. Ele poderia escolher outro nó no mesmo rack, por exemplo. No pode não estar disponível por várias razões; todos os slots de mapa podem estar em uso ou o nó pode simplesmente estar em baixo.

 14
Author: Pranab, 2015-12-13 02:44:36
Felizmente, tudo será tratado pelo enquadramento.

MapReduce o processamento de dados é impulsionado por este conceito de splits de entrada. O número de parcelas de entrada que são calculadas para uma aplicação específica determina o número de Tarefas mapper.

O número de mapas é normalmente conduzido pelo número de blocos DFS nos ficheiros de entrada.

Cada uma destas tarefas mapper é atribuída, sempre que possível, a um nó escravo onde a divisão de entrada é armazenada. O O Resource Manager (ou JobTracker, se estiver no Hadoop 1) faz o seu melhor para garantir que as parcelas de entrada são processadas localmente.

Se localização dos Dados não pode ser alcançado devido a divisões de entrada cruzando os limites dos nós de dados, alguns dados serão transferidos de um nó de dados para outro nó de dados.

Suponha que existe um bloco de 128 MB e que o último registo não cabia no bloco a e se espalha no Bloco B , Então os dados no Bloco b serão copiados para nó com bloco a

Veja este diagrama.

enter image description here

Dá uma vista de olhos em questões relacionadas

Sobre a repartição de ficheiros Hadoop/HDFS

Como É que os registos do processo Hadoop se dividem através dos limites do bloco?

 10
Author: Ravindra babu, 2017-05-23 11:46:57

Acho que o que o Deepak estava a perguntar era mais sobre como a entrada para cada chamada da função do mapa é determinada, em vez dos dados presentes em cada nó do mapa. Digo isto com base na segunda parte da pergunta.: mais especificamente, cada vez que a função map() é chamada, Qual é a chave e os parâmetros val do valor?

Na verdade, a mesma pergunta me trouxe aqui, e se eu fosse um experiente desenvolvedor hadoop, eu poderia ter interpretado como as respostas acima.

Para responder à pergunta,

O ficheiro num dado nó de mapa é dividido, com base no valor que definimos para InputFormat. (isto é feito em java usando setInputFormat () ! )

Um exemplo:

Conf.setInputFormat(TextInputFormat.classe); Aqui, passando TextInputFormat para a função setInputFormat, estamos dizendo a hadoop para tratar cada linha do arquivo de entrada no nó do mapa como a entrada para a função do mapa. Sementes de linho ou carriage-return são usados para sinalizar o fim da linha. mais informações em TextInputFormat !

Neste exemplo: Chaves são a posição no arquivo, e os valores são a linha de texto.

Espero que isto ajude.
 7
Author: Karishma Malkan, 2015-03-19 20:53:26

Diferença entre o tamanho do bloco e o tamanho da Divisão de entrada.

A Divisão de entrada é a divisão lógica dos seus dados, basicamente utilizada durante o processamento de dados no programa MapReduce ou outras técnicas de processamento. O tamanho da Divisão de entrada é um valor definido pelo utilizador e o programador Hadoop pode escolher o tamanho da divisão com base no tamanho dos dados(a quantidade de dados que está a processar).

A Divisão de entrada é basicamente usada para controlar o número de Mapper no programa MapReduce. Se não tiver definido o tamanho da Divisão de entrada em O programa MapReduce então default HDFS block split será considerado como uma divisão de entrada durante o processamento de dados.

Exemplo:

Suponha que você tem um arquivo de 100Mb e HDFS configuração padrão de bloco é 64MB então ele será cortado em 2 split e ocupar dois blocos HDFS. Agora você tem um programa MapReduce para processar esses dados, mas você não especificou a divisão de entrada então com base no número de blocos(2 bloco) será considerado como divisão de entrada para o processamento MapReduce e dois o mapper vai ser designado para este trabalho. Mas suponha que tenha especificado o tamanho da divisão (digamos 100MB) no seu programa MapReduce, então ambos os blocos(2 blocos) serão considerados como uma única divisão para o processamento MapReduce e um Mapper será designado para este trabalho.

Agora, suponha que você especificou o tamanho dividido (digamos 25MB) no seu programa MapReduce, então haverá 4 entradas divididas para o programa MapReduce e 4 Mapper será atribuído para o trabalho.

Conclusão:

  1. A Divisão de entrada é uma divisão lógica dos dados de entrada, enquanto o bloco HDFS é uma divisão física dos dados.
  2. O tamanho por omissão do bloco HDFS é um tamanho por omissão da divisão se a divisão de entrada não for especificada através do Código.
  3. a divisão é definida pelo utilizador e o utilizador pode controlar o tamanho da divisão no seu programa MapReduce.
  4. Uma divisão pode ser mapeada para vários blocos e pode haver várias divisões de um bloco.
  5. o número de tarefas do mapa (Mapper) são iguais ao número de parcelas de entrada.

Fonte: https://hadoopjournal.wordpress.com/2015/06/30/mapreduce-input-split-versus-hdfs-blocks/

 4
Author: Nikhil Redij, 2017-08-15 07:21:57

FileInputFormat é a classe abstracta que define como os ficheiros de entrada são lidos e derramados. O FileInputFormat fornece as seguintes funcionalidades: 1. seleccione os ficheiros / objectos que deverão ser usados como entrada 2. Define inputsplits que quebram um ficheiro em tarefa.

De acordo com a funcionalidade básica do hadoopp, se houver n splits então haverá n mapper.

 1
Author: shashikant, 2013-11-25 08:05:18

Quando uma tarefa Hadoop é executada, divide os ficheiros de entrada em blocos e atribui cada divisão a um mapeador para processar; isto chama-se InputSplit.

 1
Author: Siddharth Arekar, 2016-08-01 11:56:27

A resposta curta é o InputFormat cuidar da divisão do arquivo.

A forma como me aproximo desta questão é olhando para a sua classe padrão TextInputFormat:

Todas as classes InputFormat são subclasse de FileInputFormat, que tratam da divisão.

Especificamente, a função getSplit do FileInputFormat gera uma lista de InputSplit, a partir da lista de ficheiros definidos no JobContext. A divisão é baseada no tamanho dos bytes, cujo Min e Max podem ser definidos arbitrariamente no ficheiro xml do projecto.

 0
Author: Allen Lin, 2013-11-20 22:37:51
Há um mapa separado que reduz a tarefa que divide os ficheiros em blocos. Use o FileInputFormat para arquivos grandes e formato CombineFileInput para arquivos menores. Você também pode verificar se a entrada pode ser dividida em blocos pelo método issplittable. Cada bloco é então alimentado a um nó de dados onde um mapa reduz o trabalho corre para análise adicional. o tamanho de um bloco dependeria do tamanho que você mencionou no mapred.maximo.dividir.parâmetro de tamanho.
 0
Author: Pallavi Gupta, 2014-03-19 09:43:41

FileInputFormat.addInputPath(job, new Path (args [0])); ou

Conf.setInputFormat(TextInputFormat.classe);

Class FileInputFormat funcation addInputPath ,setInputFormat cuidar de inputsplit, também este código define o número de mapeadores são criados. podemos dizer inputsplit e número de mappers é diretamente proporcional ao número de blocos usados para armazenar arquivos de entrada em HDFS.

Ex. se tivermos um ficheiro de entrada com o tamanho 74 Mb, isto arquivo armazenado em HDFS em dois blocos (64 MB e 10 Mb). então inputsplit para este arquivo é duas e duas instâncias mapper são criadas para ler este arquivo de entrada.

 0
Author: Chandrakant Kadam, 2015-07-02 06:49:21