tutorial google example hadoop mapreduce

hadoop - google - mapreduce hdfs



Record Reader y Record Boundaries (3)

Supongamos que tengo un archivo de entrada y que hay tres bloques creados en HDFS para este archivo. Suponiendo que tengo tres nodos de datos y cada nodo de datos está almacenando un bloque. Si tengo 3 divisiones de entrada, 3 correlacionadores se ejecutarán en paralelo para procesar los datos locales a los nodos de datos respectivos. Cada mapeador recibe información en términos de pares de valores clave usando el Formato de entrada y el Lector de registros. Este escenario con TextInputFormat donde el registro es una línea completa de texto desde el archivo.

La pregunta aquí es qué sucede si hay una pausa récord al final del primer bloque.

1) ¿Cómo lee Hadoop el registro completo en este escenario?

2) ¿El nodo de datos 1 se pone en contacto con el nodo de datos 2 para obtener el registro completo?

3) ¿Qué sucede si el nodo de datos 2 comenzó a procesar los datos e identifica el registro incompleto en la primera línea?


  1. Hadoop hará una lectura remota al nodo 2 para obtener el resto del registro
  2. Por lo que entiendo, el nodo 2 ignorará el registro incompleto

Si tiene "Hadoop: The Definitive Guide", eche un vistazo a la página 246 (en la última edición) que trata este tema exacto (aunque en forma breve, lamentablemente).


  1. Hadoop continuará leyendo más allá del final del primer bloque hasta que se llegue al carácter EOL o EOF.
  2. Los nodos de datos no se comunican entre sí fuera de la replicación de datos (cuando el nodo de nombre los instruye). El cliente HDFS leerá los datos del nodo1 y luego del nodo2
  3. Algunos ejemplos para aclarar
    • Si tiene un solo registro de línea que abarca un archivo de 300 MB con un tamaño de bloque de 128 MB, Mapper 2 y 3 comenzarán a leer desde un desplazamiento de división dado del archivo (128 MB y 256 MB, respectivamente). Ambos saltarán hacia adelante tratando de encontrar el próximo carácter EOL y comenzarán allí los registros desde ese punto. En este ejemplo, ambos mapeadores realmente procesarán 0 registros.
    • Un archivo de 300 MB con dos líneas de 150 MB de longitud, 128 MB de tamaño de bloque: el correlacionador 1 procesará la primera línea, encontrando el carácter EOL en el bloque 2. Mapper 2 comenzará desde un desplazamiento de 128 MB (bloque 2) y buscará el carácter EOL a un offset de 150MB. Explorará hacia adelante y encontrará el EOF después del bloque 3 y procesará esta información. Mapper 3 comenzará con un desplazamiento de 256MB (bloque 3) y escaneará hacia delante hasta el EOF antes de golpear un carácter EOL, y por lo tanto procesará 0 registros
    • Un archivo de 300 MB con 6 líneas, cada una de 50 MB de longitud:
      • mapper 1 - offset 0 -> 128MB, líneas 1 (0-> 50), 2 (50-> 100), 3 (100-> 150)
      • mapper 2 - offset 128 MB -> 256 MB, líneas 4 (150 -> 200), 5 (200 -> 250), 6 (250 -> 300)
      • mapper 3 - offset 256 MB -> 300 MB, 0 líneas

Espero que ayude


Desde el código fuente de hadoop de LineRecordReader.java el contructor: encuentro algunos comentarios:

// If this is not the first split, we always throw away first record // because we always (except the last split) read one extra line in // next() method. if (start != 0) { start += in.readLine(new Text(), 0, maxBytesToConsume(start)); } this.pos = start;

de esto creo (no confirmado) hadoop leerá una línea adicional para cada división (al final de la división actual, lea la siguiente línea en la siguiente división), y si no se divide primero, la primera línea se descartará. para que no se pierda ningún registro de línea e incompleto