Comparação de MapReduce FileInputFormat e classes de implementação comumente usadas

1. Introdução

  • FileInputFormat é principalmente responsável por dividir o arquivo em várias fatias InputSplit no MapReduce e ler os dados da fatia de acordo com diferentes leitores de registro RecordReaders e convertê-los em pares chave-valor <chave, valor> padrão, como a entrada do mapa

  • E FileInputFormat tem muitas subclasses de implementação diferentes, e cada classe de implementação tem um mecanismo de divisão e de leitura de registro diferente.

  • As várias classes de implementação são as seguintes

  • Insira a descrição da imagem aqui

Dica:

  • A divisão de dados apenas divide a entrada logicamente e não a divide no disco para armazenamento

2. O mecanismo de divisão padrão de FileInputFormat

  • Fatia de acordo com o tamanho do bloco de arquivo
  • O tamanho do bloco padrão é 128 M para cortar, porque o tamanho do bloco de armazenamento padrão do HDFS também é 128 M. Dessa forma, quando cada MapTask processa o conteúdo da fatia, é desnecessário carregar dados entre os nós, o que pode reduzir o IO da rede de transmissão.
  • Ao fatiar, todo o conjunto de dados não é considerado, mas cada arquivo é fatiado separadamente, um por um

Por exemplo
1, se houver dois arquivos no caminho de entrada MapReduce, a.txt é 320M, b.txt tem 10M de tamanho
2 e as informações de fatia geradas após o fatiamento por FileInputFormat são as seguintes:

// 总产生4个切片,文件a有3个切片,文件b有1个切片
a.txt的切片1: 0~128M
a.txt的切片2: 128~256M
a.txt的切片3: 256~320M

b.txt的切片1:  0~10M

3 、 TextInputFormat

  • O mecanismo de fatiamento é consistente com FileInputFormat

  • O formato TextInput é a classe de implementação FilelnputFormat padrão.

  • O leitor de registro RecordReader éLeia cada registro por linha.

  • Após a leitura, a chave Key é o deslocamento de byte inicial da linha em todo o arquivo, tipo longo gravável. O valor é o conteúdo desta linha, excluindo qualquer terminador de linha (nova linha e retorno de carro), tipo de texto. Este par de valores-chave será então usado como entrada do Mapeador

Caso:
a seguir estão as informações de conteúdo contidas em uma fatia

1 ---b c
2 ---e f
3 ---a b

Então, a saída <key, value> após ser lida por TextInputFormat é:

(0,"---b c")
(6,"---e f")
(12,"---a b")

4 、 KeyValueTextInputFormat

  • O mecanismo de fatiamento é consistente com FileInputFormat
  • O leitor de registro RecordReader éTambém é lido por linha, mas após a leitura, cada linha será cortada em duas partes, a primeira parte é usada como chave e a segunda metade é produzida como o valor
  • O separador de corte padrão é tab (\ t), que pode ser definido pelo método set na Configuração, por exemplo, aqui ele é definido para pressionar "—cutting" conf.set (KeyValueLineRecordReader.KEY_VALUE_SEPERATOR, "-");

Caso:
a seguir estão as informações de conteúdo contidas em uma fatia

1 --- b c
2 --- e f
3 --- a b

Então, a saída <key, value> após a leitura por KeyValueTextInputFormat é:

(1,"b c")
(2,"e f")
(3,"a b")

5 、 NLineInputFormat

  • O mecanismo de fatiamento é diferente de FileInputFormat,É fatiado de acordo com o número definido de linhas
  • O mecanismo RecordReader do leitor de registro é consistente com TextInputFormat

Caso:
a seguir estão as informações de conteúdo contidas em uma fatia

1 --- b c
2 --- e f
3 --- a b
4 --- g d
5 --- f d

Se o número de linhas de corte for definido como 2, cada 2 linhas serão divididas em uma fatia e 3 fatias serão geradas. Então, depois que cada fatia é lida pelo RecordReader, a saída <chave, valor> é consistente com TextInputFormat
Fatia 1:

(0,"---b c")
(6,"---e f")

Fatia 2:

(12,"---a b")
(18,"---g d")

Fatia 3:

(24,"---f d")

6 、 CombineTextInputFormat

  • O mecanismo de fatiamento é diferente de FileInputFormat
  • Como FileInputFormat divide cada arquivo independentemente, não importa quão pequeno seja o arquivo, cada arquivo irá gerar uma ou mais fatias. CombineTextInputFormat pode planejar logicamente vários arquivos pequenos em uma fatia, de modo que você só possa enviar Dê um processamento MapTask.
  • Aplicação: CombineTextInputFormat é adequado para processar vários arquivos pequenos

6.1 Mecanismo de corte

  • Ele precisa ser dividido de acordo com um conjunto de parâmetros, chamado de fatia máxima de armazenamento virtual.
  • O arquivo de armazenamento virtual será gerado primeiro por meio da partição de armazenamento virtual e, em seguida, dividido de acordo com as informações de resultado do arquivo de armazenamento virtual.

Caso:
assumindo que a fatia máxima de armazenamento virtual está definida para 4M,
existem os seguintes 5 arquivos e seus tamanhos:
a.txt (
1,7M)
b.txt (5,1M ) c.txt (3,4 M)
d.txt (
6,8M ) e.txt (10M)

Etapa 1: o processo de particionamento de armazenamento virtual
-Princípio de Divisão, Ao processar cada arquivo, ele é comparado com o valor máximo da fatia de armazenamento virtual definido (4 M) por sua vez. Se não for maior do que o valor máximo definido, divida logicamente um bloco. Se o arquivo de entrada for maior que o valor máximo definido e mais de duas vezes, corte um bloco com o valor máximo; quando o tamanho dos dados restantes exceder o valor máximo definido e não mais do que duas vezes o valor máximo, o arquivo será dividido em 2 blocos de armazenamento virtual neste momento

Procedimento armazenado virtual
a.txt (1,7M) Porque 1,7 <4, é dividido em um bloco
b.txt (5,1M) Porque 5,1> 4 e menor que (2 x 4M), é dividido em dois uniformemente. Ou seja, bloco 1 [0,2.55] e bloco 2 [2.56,5.1]
c.txt (3,4 M) Porque 3,4 <4, é dividido em um bloco
d.txt (6,8M) Como 6,8> 4 e menor que (2 x 4M), ele é dividido em dois igualmente. Ambos os blocos 1 e 2 são 3,4M
e.txt (10M) Como 10> (2 x 4M), o bloco 1 é dividido em 4M, os 6M restantes repete a regra de divisão de b.txt, o bloco 2 e o bloco 3 são divididos cada um em 3M

De acordo com a tabela acima, o bloco final de arquivos de armazenamento virtual tem

1.7M
2.55M
2.55M
3.4M
3.4M
3.4M
4M
3M
3M

Etapa 2: divida de acordo com o resultado do bloco de arquivos de armazenamento virtual

  • 1) Determine se o tamanho do arquivo do armazenamento virtual é maior que o valor máximo da fatia de armazenamento virtual e, se for maior ou igual ao máximo, uma fatia é formada separadamente.
  • 2) Se não for maior que, mescle com o próximo arquivo de armazenamento virtual para formar uma fatia juntos

5 fatias são geradas após a fusão

(1.7 + 2.55)M
(2.55 + 3.4) M
(3.4 + 3.4) M
4M
(3 + 3) M

6.2 Mecanismo de leitura de registro

  • Como TextInputFormat, o conteúdo de cada fatia é lido em linha.A chave de saída é o deslocamento de byte inicial da linha em todo o arquivo, e o valor é o conteúdo da linha.

7. Diferença e comparação

Classe de implementação Mecanismo de corte Mecanismo de leitura de registro RecordReader Resultado de saída- (KeyIn, KeyOut)
TextInputFormat Fatia de bloco Saída por linha (Início do deslocamento de cada linha, conteúdo de cada linha)
KeyValueTextInputFormat Fatia de bloco Divida cada linha de saída por separador (Peça antes de cortar, peça depois de cortar)
NLineInputFormat Fatia por linha número N Saída por linha (Início do deslocamento de cada linha, conteúdo de cada linha)
CombineTextInputFormat Fatia por arquivo de armazenamento virtual Saída por linha (Início do deslocamento de cada linha, conteúdo de cada linha)

8. Recompensa

Se você achar o artigo útil, pode encorajar o autor

Insira a descrição da imagem aqui

Acho que você gosta

Origin blog.csdn.net/weixin_41347419/article/details/109059486
Recomendado
Clasificación