Comparación de MapReduce FileInputFormat y las clases de implementación de uso común

1. Introducción

  • FileInputFormat es principalmente responsable de dividir el archivo en múltiples segmentos InputSplit en MapReduce, y leer los datos del segmento de acuerdo con los diferentes lectores de registros RecordReaders, y convertirlos en pares estándar <clave, valor> clave-valor, como la entrada del mapa

  • Y FileInputFormat tiene muchas subclases de implementación diferentes, y cada clase de implementación tiene un mecanismo de división y un mecanismo de lectura de registros diferentes.

  • Las diversas clases de implementación son las siguientes

  • Inserte la descripción de la imagen aquí

Propina:

  • La segmentación de datos solo segmenta la entrada de forma lógica y no la segmenta en el disco para su almacenamiento

2. El mecanismo de división predeterminado de FileInputFormat

  • Cortar según el tamaño del bloque de archivos
  • El tamaño de bloque predeterminado es 128 M para cortar, porque el tamaño de bloque de almacenamiento predeterminado de HDFS también es 128 M. De esta manera, cuando cada MapTask procesa el contenido del segmento, no es necesario cargar datos entre los nodos, lo que puede reducir la E / S de la red de transmisión.
  • Al cortar, no se considera todo el conjunto de datos, pero cada archivo se divide por separado uno por uno

Por ejemplo
1, si hay dos archivos bajo la ruta de entrada de MapReduce, a.txt es 320M, b.txt es 10M en tamaño
2 y la información de corte generada después de cortar por FileInputFormat es la siguiente:

// 总产生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

  • El mecanismo de corte es consistente con FileInputFormat

  • TextInput Format es la clase de implementación FilelnputFormat predeterminada.

  • El lector de registros RecordReader esLea cada registro por línea.

  • Después de leer, la clave Key es el byte inicial de desplazamiento de la fila en todo el archivo, tipo de escritura larga. El valor es el contenido de esta línea, excluyendo cualquier terminador de línea (nueva línea y retorno de carro), tipo de texto. Este par clave-valor se utilizará como entrada de Mapper

Caso:
la siguiente es la información de contenido contenida en un segmento

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

Entonces la salida de <key, value> después de ser leída por TextInputFormat es:

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

4 、 KeyValueTextInputFormat

  • El mecanismo de corte es consistente con FileInputFormat
  • El lector de registros RecordReader esTambién se lee por línea, pero después de la lectura, cada línea se cortará en dos partes, la primera parte se utilizará como clave y la segunda mitad se emitirá como valor.
  • El separador de corte predeterminado es tab (\ t), que se puede configurar mediante el método set en Configuración, por ejemplo, aquí se configura para presionar "—cut" conf.set (KeyValueLineRecordReader.KEY_VALUE_SEPERATOR, "-");

Caso:
la siguiente es la información de contenido contenida en un segmento

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

Entonces la salida de <clave, valor> después de leer por KeyValueTextInputFormat es:

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

5 、 NLineInputFormat

  • El mecanismo de corte es diferente de FileInputFormat,Se corta de acuerdo con el número establecido de filas.
  • El mecanismo RecordReader del lector de registros es coherente con TextInputFormat

Caso:
la siguiente es la información de contenido contenida en un segmento

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

Si el número de filas de corte se establece en 2, entonces cada 2 filas se dividirá en un segmento y se generarán 3 segmentos. Luego, después de que RecordReader lea cada segmento, la salida <key, value> es coherente con TextInputFormat
Slice 1:

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

Rebanada 2:

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

Rebanada 3:

(24,"---f d")

6 、 CombineTextInputFormat

  • El mecanismo de corte es diferente de FileInputFormat
  • Debido a que FileInputFormat divide cada archivo de forma independiente, no importa cuán pequeño sea el archivo, cada archivo generará 1 o más secciones por separado. CombineTextInputFormat puede planificar lógicamente varios archivos pequeños en una sola sección, de modo que solo pueda enviar Dar un procesamiento MapTask.
  • Aplicación: CombineTextInputFormat es adecuado para procesar varios archivos pequeños

6.1 Mecanismo de corte

  • Debe dividirse de acuerdo con un conjunto de parámetros, llamado segmento de almacenamiento virtual máximo.
  • El archivo de almacenamiento virtual se generará primero a través de la división de almacenamiento virtual y luego se dividirá de acuerdo con la información de resultado del archivo de almacenamiento virtual.

Caso:
Suponiendo que el segmento de almacenamiento virtual máximo se establece en 4M,
existen los siguientes 5 archivos y sus tamaños:
a.txt (1.7M)
b.txt (5.1M)
c.txt (3.4 M)
d.txt (6.8M)
e.txt (10 millones)

Paso 1: el proceso de partición del almacenamiento virtual
-Principio de división, Al procesar cada archivo, se compara sucesivamente con el valor máximo del segmento de almacenamiento virtual establecido (4M). Si no es mayor que el valor máximo establecido, lógicamente divida un bloque. Si el archivo de entrada es más grande que el valor máximo establecido y más del doble, entonces corte un bloque con el valor máximo; cuando el tamaño de los datos restantes excede el valor máximo establecido y no más del doble del valor máximo, el archivo se divide en 2 bloques de almacenamiento virtual en este momento

Procedimiento almacenado virtual
a.txt (1,7 M) Como 1.7 <4, se divide en uno
b.txt (5,1 M) Debido a que 5.1> 4 y menor que (2 x 4M), se divide en dos partes iguales. Es decir, el bloque 1 [0,2.55] y el bloque 2 [2.56,5.1]
c.txt (3,4 M) Como 3.4 <4, se divide en un bloque
d.txt (6,8 M) Debido a que 6,8> 4 y menos que (2 x 4 M), se divide en dos partes iguales. Tanto el bloque 1 como el bloque 2 son 3,4 M
e.txt (10 M) Dado que 10> (2 x 4M), el bloque 1 se divide en 4M, los 6M restantes repiten la regla de corte de b.txt, el bloque 2 y el bloque 3 se dividen cada uno en 3M

De acuerdo con la tabla anterior, el bloque de archivos de almacenamiento virtual final tiene

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

Paso 2: corte de acuerdo con el resultado del bloque de archivos de almacenamiento virtual

  • 1) Determine si el tamaño del archivo del almacenamiento virtual es mayor que el valor máximo del segmento de almacenamiento virtual, y si es mayor o igual al máximo, se forma un segmento por separado.
  • 2) Si no es mayor que, fusionar con el siguiente archivo de almacenamiento virtual para formar un segmento juntos

Se generan 5 cortes después de fusionar

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

6.2 Mecanismo de lectura de registros

  • Al igual que TextInputFormat, el contenido de cada segmento se lee línea por línea. La clave de salida es el byte inicial de desplazamiento de la línea en todo el archivo y el valor es el contenido de la línea.

7. Diferencia y comparación

Clase de implementación Mecanismo de corte Mecanismo de lectura de registros RecordReader Resultado de salida- (KeyIn, KeyOut)
TextInputFormat Rebanada de bloque Salida por línea (Desplazamiento inicial de cada línea, contenido de cada línea)
KeyValueTextInputFormat Rebanada de bloque Dividir cada línea de salida por separador (Parte antes de cortar, parte después de cortar)
NLineInputFormat Cortar por número de fila N Salida por línea (Desplazamiento inicial de cada línea, contenido de cada línea)
CombineTextInputFormat Corte por archivo de almacenamiento virtual Salida por línea (Desplazamiento inicial de cada línea, contenido de cada línea)

8. Recompensa

Si encuentra útil el artículo, puede animar al autor

Inserte la descripción de la imagen aquí

Supongo que te gusta

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