¿Cuál es el propósito de RecordReader en Hadoop?

Mientras procesamos datos en Hadoop, usamos Mapper y Reducer (MapReduce clásico).

Ambas funciones de mapeador y reductor tienen pares como entrada y salida.

Al almacenar datos en HDFS es como un simple volcado. A Hadoop no le importa dónde termina la línea o termina el registro … solo divide los datos en bloques y los guarda.

Entonces, para que Mapper se inicie, se deben leer los datos sin procesar. Mientras hablamos de inputformat, consideremos Texto por ahora. El lector de registros aparece en la imagen.

Al iniciarse en una división de entrada, el lector de registros busca el inicio de la línea en la división y lee los datos a través de la división. Si no puede encontrar el final de la línea en esa división de entrada, leerá la parte restante de la línea de forma remota desde otra división.

Genera datos significativos que los mapeadores pueden entender y los pasa al mapeador.

Igual es el caso cuando inputformat es DB, lee registros en lugar de líneas.

Por ejemplo, mientras hago el programa de conteo de palabras, mi archivo tiene datos como

****************************** Estoy aprendiendo HAdoop. **************************

Y mientras se dividía en bloques, mis datos se dividieron en el aprendizaje. me gusta

“************************ Estoy aprendiendo” en un bloque y “HAdoop. ************* ”

Entonces el lector REcord forma una línea completa “*** Estoy aprendiendo HAdoop. “Y se envía al asignador.

Mientras procesamos datos en Hadoop, usamos Mapper y Reducer (MapReduce clásico).

Ambas funciones de mapeador y reductor tienen pares como entrada y salida.

Al almacenar datos en HDFS es como un simple volcado. A Hadoop no le importa dónde termina la línea o termina el registro … solo divide los datos en bloques y los guarda.

Entonces, para que Mapper se inicie, se deben leer los datos sin procesar. Mientras hablamos de inputformat, consideremos Texto por ahora. El lector de registros aparece en la imagen.

Al iniciarse en una división de entrada, el lector de registros busca el inicio de la línea en la división y lee los datos a través de la división. Si no puede encontrar el final de la línea en esa división de entrada, leerá la parte restante de la línea de forma remota desde otra división.

Genera datos significativos que los mapeadores pueden entender y los pasa al mapeador.

Igual es el caso cuando inputformat es DB, lee registros en lugar de líneas.

Por ejemplo, mientras hago el programa de conteo de palabras, mi archivo tiene datos como

****************************** Estoy aprendiendo HAdoop. **************************

Y mientras se dividía en bloques, mis datos se dividieron en el aprendizaje. me gusta

“************************ Estoy aprendiendo” en un bloque y “HAdoop. ************* ”

Entonces el lector REcord forma una línea completa “*** Estoy aprendiendo HAdoop. “Y se envía al asignador.

RecordReader

Se comunica con InputSplit (creado por InputFormat) y también convierte la división en registros. Aquí, los registros están en forma de pares clave-valor . Esos son adecuados para leer con el Mapper . RecordReader se comunica con el split de entrada hasta que no lee el archivo completo.

Utiliza los datos dentro de los límites, definidos por InputSplit. Al “inicio”, RecordReader en hadoop comienza a generar pares clave-valor y el “final” es donde debe dejar de leer registros.
El marco de MapReduce define la instancia de RecordReader por InputFormat. Por defecto; utiliza TextInputFormat para convertir datos en pares clave-valor.

TextInputFormat proporciona 2 tipos de RecordReader:

1. LineRecordReader

2. SequenceFileRecordReader.

LineRecordReader- LineRecordReader en Hadoop es el RecordReader predeterminado que proporciona TextInputFormat. Por lo tanto, cada línea del archivo de entrada es el nuevo valor y una clave es el desplazamiento de bytes.

SequenceFileRecordReader: lee los datos especificados por el encabezado de un archivo de secuencia.

Siga el enlace para obtener más información sobre RecordReader en Hadoop

Para actualizar su conocimiento de Hadoop. Siga el enlace: Las 100 preguntas y respuestas más importantes de la entrevista de Hadoop

No solo te satisfagas conociendo la teoría del lector de registros. Es una clase muy grande utilizada para crear pares de valores clave a partir del archivo de entrada. Esta clase se inicializa por objeto de su clase de formato de entrada.

Consulte la Sección 8 de este curso donde se explica la implementación en tiempo real de Record Reader y sí, con el programa de reducción de mapas adecuado.

https://www.udemy.com/hadoop-map

nuestra entrada se divide en muchos bloques,
-> el lector de registros se usa para leer los datos divididos en datos únicos
por ejemplo, nuestros datos de entrada se dividen de la siguiente manera,
(fila1) mi nombre es
(fila2) ABCD
los datos anteriores se leen como “mi nombre es ABCD” utilizando el lector de recodr

InputSplit ha definido una porción de trabajo, pero no describe cómo acceder a él. La clase RecordReader en realidad carga los datos de su fuente y los convierte en pares (clave, valor) adecuados para que el Mapper los lea. La instancia de RecordReader está definida por InputFormat. El InputFormat predeterminado, TextInputFormat , proporciona un LineRecordReader , que trata cada línea del archivo de entrada como un nuevo valor. La clave asociada con cada línea es su desplazamiento de bytes en el archivo. RecordReader se invoca repetidamente en la entrada hasta que se haya consumido todo el InputSplit. Cada invocación de RecordReader conduce a otra llamada al método map () del Mapper.

Para comprender el lector de registros en Hadoop, necesitamos comprender el flujo de datos en hadoop. Veamos cómo fluyen los datos:

MapReduce tiene un modelo simple de procesamiento de datos: las entradas y salidas para el mapa y las funciones de reducción son pares clave-valor. Las funciones map y reduce en Hadoop MapReduce tienen la siguiente forma general:

mapa: (K1, V1) → lista (K2, V2)

reducir: (K2, lista (V2)) → lista (K3, V3)

Ahora, antes de procesar, necesita saber qué datos procesar, esto se logra con la clase InputFormat . InputFormat es la clase que selecciona el archivo de HDFS que se debe ingresar a la función de mapa. Un InputFormat también es responsable de crear las divisiones de entrada y dividirlas en registros. Los datos se dividen en número de divisiones (generalmente 64 / 128mb) en HDFS. Una división de entrada es una porción de la entrada que es procesada por un solo mapa.

La clase InputFormat llama a la función getSplits () y calcula las divisiones para cada archivo y luego los envía al rastreador de trabajos, que utiliza sus ubicaciones de almacenamiento para programar tareas de mapa para procesarlas en los rastreadores de tareas. En un rastreador de tareas, la tarea de mapa pasa la división al método createRecordReader () en InputFormat para obtener un RecordReader para esa división. RecordReader carga datos de su fuente y los convierte en pares clave-valor adecuados para leer con el mapeador. El InputFormat predeterminado es TextInputFormat, que trata cada valor de entrada como un nuevo valor y la clave asociada es el desplazamiento de bytes.

Un RecordReader es poco más que un iterador sobre registros, y la tarea de mapeo usa uno para generar pares de clave-valor de registro, que pasa a la función de mapa. Podemos ver esto mirando el método run () de Mapper:

public void run (Context context) arroja IOException, InterruptedException {
configuración (contexto);
while (context.nextKeyValue ()) {
map (context.getCurrentKey (), context.getCurrentValue (), context);
}
limpieza (contexto);
}

Después de ejecutar setup (), se invoca repetidamente nextKeyValue () en el Contexto (que delega al método con el mismo nombre en RecordReader) para completar los objetos clave y de valor para el asignador. La clave y el valor se recuperan del Lector de registros a través del contexto, y se pasan al método map () para que haga su trabajo. La entrada a la función de mapa que es el par clave-valor (K, V) se procesa según la lógica mencionada en el código del mapa.

Cuando el lector llega al final de la secuencia, el método nextKeyValue () devuelve falso y la tarea de mapa ejecuta su método cleanup () .

La salida del mapeador se envía al particionador. Partitioner controla la partición de las claves de las salidas de mapa intermedias. La clave (o un subconjunto de la clave) se utiliza para derivar la partición, generalmente mediante una función hash. El número total de particiones es igual al número de tareas de reducción para el trabajo. Por lo tanto, esto controla cuál de las m tareas de reducción envía la clave intermedia (y, por lo tanto, el registro) para su reducción. El uso de particionadores es opcional.

Todos los valores correspondientes a la misma clave irán al mismo reductor.

La salida del mapeador se escribe primero en el disco local para el proceso de clasificación y barajado . También está en forma de par clave-valor. Y luego se fusiona y finalmente se entrega al reductor.

MapReduce garantiza que la entrada a cada reductor está ordenada por clave. El proceso por el cual el sistema realiza la clasificación, y transfiere las salidas del mapa a los reductores como entradas, se conoce como la combinación aleatoria . Se dice que el shuffle es el corazón de MapReduce y es donde ocurre la “magia”.

La salida de todos los mapeadores va a todos los reductores. Durante la fase de reducción, la función de reducción se invoca para cada tecla en la salida ordenada. El resultado de esta fase se escribe en el sistema de archivos de salida, generalmente HDFS. El par clave-valor proporcionado como salida por el reductor se pasa a OutputFormat, que luego se escribe en HDFS. También proporciona la clase RecordWriter que escribe registros individuales en el archivo mencionado en setOutputPath (). Cada reductor escribe un archivo separado en el directorio de salida y estos archivos se nombran como parte-00000.

También se puede usar el combinador para el propósito de optimización. Combiner se coloca conceptualmente después del bloque de mapa y reduce la salida particular de ese bloque de mapa. Generalmente se denomina mini-reductor. También reduce el retraso de la red.

El “InputSplit” define una porción de trabajo, pero no describe cómo acceder a él. La clase “RecordReader” carga los datos de su fuente y los convierte en pares (clave, valor) adecuados para la lectura de la tarea “Mapper”. La instancia de “RecordReader” se define mediante el “Formato de entrada”.