Hadoop MapReduce Join & Counter con ejemplo
⚡ Resumen inteligente
Las operaciones de unión de MapReduce combinan dos grandes conjuntos de datos mediante una clave compartida, ya sea dentro del mapeador o dentro del reductor, mientras que los contadores de MapReduce recopilan estadísticas sobre el trabajo para que los registros erróneos puedan medirse en lugar de adivinarse.
¿Qué es Join en MapReduce?
La operación de unión de MapReduce se utiliza para combinar dos conjuntos de datos grandes. Sin embargo, este proceso implica escribir mucho código para realizar la operación de unión. La unión de dos conjuntos de datos comienza comparando el tamaño de cada uno. Si un conjunto de datos es más pequeño que el otro, se distribuye el conjunto de datos más pequeño a todos los nodos de datos del clúster.
Una vez que se une MapReduce Cuando se distribuye, ya sea el Mapper o el Reducer, se utiliza el conjunto de datos más pequeño para realizar una búsqueda de registros coincidentes en el conjunto de datos grande y luego se combinan esos registros para formar registros de salida.
Tipos de Unión
Dependiendo del lugar donde se realiza la unión, las uniones en Hadoop se clasifican en dos tipos.
- Unión del lado del mapa Cuando la unión la realiza el mapeador, se denomina unión del lado del mapeo. En este caso, la unión se realiza antes de que la función de mapeo procese los datos. Es obligatorio que la entrada de cada mapeo sea una partición y esté ordenada. Además, debe haber un número igual de particiones y deben estar ordenadas por la clave de unión.
- Unión del lado de reducción Cuando la unión la realiza el reductor, se denomina unión del lado del reductor. En este tipo de unión, no es necesario que el conjunto de datos esté estructurado (o particionado). En este caso, el procesamiento del lado del mapa genera la clave de unión y las tuplas correspondientes de ambas tablas. Como resultado de este procesamiento, todas las tuplas con la misma clave de unión se envían al mismo reductor, que luego une los registros con dicha clave.
En el siguiente diagrama se muestra un flujo de proceso general de uniones en Hadoop.

Una vez claras las dos variantes, la siguiente sección describe cómo realizar una unión del lado de la reducción en dos archivos departamentales pequeños.
Cómo unir dos conjuntos de datos: ejemplo de MapReduce
Hay dos conjuntos de datos en dos archivos diferentes (que se muestran a continuación). La clave Dept_ID es común en ambos archivos. El objetivo es usar MapReduce Join para combinar estos archivos.
Entrada: El conjunto de datos de entrada es un archivo txt, DeptName.txt y DeptStrength.txt.
Descargue archivos de entrada desde aquí
Asegúrate de que tienes Hadoop instalado. Antes de comenzar con el proceso real del ejemplo MapReduce Join, cambie el usuario a 'hduser' (ID utilizado durante la configuración de Hadoop; puede cambiar al ID de usuario utilizado durante su configuración de Hadoop).
su - hduser_
Los cambios en la solicitud se realizan a la cuenta de Hadoop, como se muestra a continuación.
Paso 1) Copie el archivo zip a la ubicación de su elección
Paso 2) Descomprimir el archivo zip
sudo tar -xvf MapReduceJoin.tar.gz
La extracLos nombres de los archivos se desplazan a medida que tar descomprime el archivo.
Paso 3) Ir al directorio MapReduceJoin/
cd MapReduceJoin/
Paso 4) Iniciar Hadoop
$HADOOP_HOME/sbin/start-dfs.sh
$HADOOP_HOME/sbin/start-yarn.sh
Ambos scripts imprimen los demonios que invocan.
Paso 5) DeptStrength.txt y DeptName.txt son los archivos de entrada utilizados para este programa de ejemplo MapReduce Join.
Estos archivos deben copiarse a HDFS utilizando el siguiente comando:
$HADOOP_HOME/bin/hdfs dfs -copyFromLocal DeptStrength.txt DeptName.txt /
Paso 6) Ejecute el programa usando el siguiente comando:
$HADOOP_HOME/bin/hadoop jar MapReduceJoin.jar MapReduceJoin/JoinDriver/DeptStrength.txt /DeptName.txt /output_mapreducejoin
Primero se muestra el comando y, a continuación, el proceso informa de su progreso en la consola.
Paso 7) Tras la ejecución, el archivo de salida (denominado 'part-00000') se almacenará en el directorio /output_mapreducejoin en HDFS.
Los resultados se pueden ver usando la interfaz de línea de comando.
$HADOOP_HOME/bin/hdfs dfs -cat /output_mapreducejoin/part-00000
Los resultados también se pueden ver a través de una interfaz web como:
Ahora seleccione 'Explorar el sistema de archivos' y navegue hasta /output_mapreducejoin
Abrir parte-r-00000
Se muestran los resultados
NOTA: Tenga en cuenta que antes de ejecutar este programa la próxima vez, deberá eliminar el directorio de salida /output_mapreducejoin
$HADOOP_HOME/bin/hdfs dfs -rm -r /output_mapreducejoin
La alternativa es utilizar un nombre diferente para el directorio de salida.
Las uniones te indican cómo son los datos. Los contadores, que se explicarán a continuación, te indican cómo se comportó el proceso que los generó.
¿Qué es el contador en MapReduce?
Un contador en MapReduce es un mecanismo utilizado para recopilar y medir información estadística sobre los trabajos y eventos de MapReduce. Los contadores mantienen la track de diversas estadísticas de trabajo en MapReduce, como el número de operaciones realizadas y el progreso de la operación. Los contadores se utilizan para el diagnóstico de problemas en MapReduce.
Los contadores de Hadoop son similares a poner un mensaje de registro en el código de un mapa o reducir. Esta información podría ser útil para el diagnóstico de un problema en el procesamiento de trabajos de MapReduce.
Normalmente, estos contadores en Hadoop se definen en un programa (map o reduce) y se incrementan durante la ejecución cuando ocurre un evento o condición particular (específico de ese contador). Una muy buena aplicación de los contadores de Hadoop es... track registros válidos e inválidos de un conjunto de datos de entrada.
Tipos de contadores MapReduce
Básicamente existen 2 tipos de contadores MapReduce.
- Contadores integrados de Hadoop: Hay algunos contadores de Hadoop integrados que existen por trabajo. A continuación se muestran los grupos de contadores integrados.
- Contadores de tareas MapReduce — Recopila información específica de la tarea (por ejemplo, número de registros de entrada) durante su tiempo de ejecución.
- Contadores del sistema de archivos — Recopila información como el número de bytes leídos o escritos por una tarea.
- Contadores FileInputFormat — Recopila información de una cantidad de bytes leídos a través de FileInputFormat.
- Contadores FileOutputFormat — Recopila información de una cantidad de bytes escritos a través de FileOutputFormat.
- Contadores de trabajos — Estos contadores registran estadísticas generales del puesto de trabajo, como el número de tareas iniciadas para un puesto.
- Contadores definidos por el usuario: Además de los contadores integrados, un usuario puede definir sus propios contadores utilizando funcionalidades similares proporcionadas por los lenguajes de programación. Por ejemplo, en JavaSe utiliza una enumeración para definir contadores definidos por el usuario.
💡 Nota de la versión: El contador de trabajos era mantenido por el JobTracker bajo MRv1. En YARN, ese rol pertenece al ApplicationMaster de MapReduce, por lo que los nombres de los contadores se mantienen, pero el componente que los informa ha cambiado.
Un trabajo no puede declarar un número ilimitado de contadores. mapreduce.job.counters.max La configuración limita el total por trabajo a 120 por defecto, y un trabajo que declara más falla con un LimitExceededExceptionPor lo tanto, los contadores están pensados para un conjunto de señales agregadas, en lugar de recuentos por tecla.
Ejemplo de contadores
Un ejemplo de MapClass con contadores para contar el número de valores faltantes e inválidos. Archivo de datos de entrada utilizado en este tutorial: Nuestro conjunto de datos de entrada es un archivo CSV, SalesJan2009.csv.
public static class MapClass extends MapReduceBase implements Mapper<LongWritable, Text, Text, Text> { static enum SalesCounters { MISSING, INVALID }; public void map ( LongWritable key, Text value, OutputCollector<Text, Text> output, Reporter reporter) throws IOException { //Input string is split using ',' and stored in 'fields' array String fields[] = value.toString().split(",", -20); //Value at 4th index is country. It is stored in 'country' variable String country = fields[4]; //Value at 8th index is sales data. It is stored in 'sales' variable String sales = fields[8]; if (country.length() == 0) { reporter.incrCounter(SalesCounters.MISSING, 1); } else if (sales.startsWith("\"")) { reporter.incrCounter(SalesCounters.INVALID, 1); } else { output.collect(new Text(country), new Text(sales + ",1")); } } }
El fragmento de código anterior muestra un ejemplo de implementación de contadores en Hadoop MapReduce.
Aquí, Contadores de ventas es un contador definido usando 'enumerarSe utiliza para contar los registros de entrada FALTANTES e INVÁLIDOS.
En el fragmento de código, si 'paísEl campo ' tiene longitud cero, por lo tanto, su valor falta y, en consecuencia, el contador correspondiente SalesCounters.MISSING se incrementa.
A continuación, si 'ventasEl campo ' comienza con una " , entonces el registro se considera INVÁLIDO. Esto se indica incrementando el contador SalesCounters.INVALID.
💡 Nota sobre la API: El fragmento anterior utiliza el original. org.apache.hadoop.mapred API, donde MapReduceBase, Mapper interfaz, OutputCollector y Reporter aparecen por separado. El código actual está escrito en contra org.apache.hadoop.mapreduce, donde un solo Context reemplaza al recolector y al reportero, y se incrementa un contador con context.getCounter(SalesCounters.MISSING).increment(1)El concepto de contador es idéntico en ambos casos.











