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.

  • 🔘 Información básica para unirse: El conjunto de datos más pequeño de los dos se distribuye a cada nodo de datos y se utiliza como elemento de consulta.
  • ☑️ Unión del lado del mapa: Requiere que cada entrada se particione, se divida equitativamente y se ordene por la clave de unión antes de que se ejecute la función de mapeo.
  • ✅ Unión del lado de reducción: No necesita particionamiento, ya que cada tupla que comparte una clave de unión termina en el mismo reductor.
  • 🧪 Ejemplo trabajado: Los archivos DeptName.txt y DeptStrength.txt se copian en HDFS y se unen mediante Dept_ID utilizando un archivo JAR empaquetado.
  • 🛠️ Tipos de contador: Cinco grupos de contadores integrados se envían con cada trabajo, y los contadores definidos por el usuario se declaran como un Java enumeración.
  • ⚠️ Uso del mostrador: Incrementar un contador por cada registro faltante o inválido convierte los problemas de calidad de los datos en un número en el informe de trabajo.

Tutorial de unión y contador de Hadoop MapReduce con un ejemplo práctico.

¿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.

  1. 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.
  2. 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.

Diagrama de flujo de proceso que compara una unión del lado del mapa con una unión del lado de la reducción en Hadoop.
Tipos de uniones en Hadoop MapReduce

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.

Primer archivo de entrada que enumera los ID de los departamentos junto con los nombres de los departamentos.

archivo 1
Segundo archivo de entrada que enumera los ID de los departamentos junto con los valores de personal de cada departamento.

archivo 2

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.

Terminal después de cambiar a la cuenta hduser con el comando su

Paso 1) Copie el archivo zip a la ubicación de su elección

El archivo MapReduceJoin descargado se encuentra en el directorio de trabajo seleccionado.

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.

Listado de archivos de la consola, por ejemplotracted de MapReduceJoin.tar.gz

Paso 3) Ir al directorio MapReduceJoin/

cd MapReduceJoin/

Indicador de la consola después de cambiar al directorio MapReduceJoin

Paso 4) Iniciar Hadoop

$HADOOP_HOME/sbin/start-dfs.sh
$HADOOP_HOME/sbin/start-yarn.sh

Ambos scripts imprimen los demonios que invocan.

Mensajes de inicio de los scripts del demonio HDFS y YARN

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 /

Ambos archivos de texto de entrada se copiaron en el directorio raíz de HDFS.

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.

Ejecución desde la línea de comandos del archivo JAR empaquetado de MapReduceJoin

Salida de consola tracseguir el progreso del trabajo de unión de MapReduce

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

Registros del departamento unidos impresos desde HDFS por el comando cat

Los resultados también se pueden ver a través de una interfaz web como:

Página de inicio de la interfaz web de Hadoop utilizada para acceder al navegador del sistema de archivos.

Ahora seleccione 'Explorar el sistema de archivos' y navegue hasta /output_mapreducejoin

Navegando por la vista del sistema de archivos HDFS hasta el directorio output_mapreducejoin.

Abrir parte-r-00000

Seleccionar el archivo de salida part-r-00000 dentro de la vista del navegador

Se muestran los resultados

Se muestran en el navegador las filas con el nombre del departamento al que se unió y la cantidad de miembros del departamento.

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.

  1. 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.
  2. 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.

Preguntas Frecuentes

Elija la variante mapeadora cuando un lado sea lo suficientemente pequeño como para almacenarse en memoria en cada nodo, ya que omite por completo la reorganización. Elija la variante reductora cuando ambos lados sean grandes o no estén ordenados, y acepte el costo adicional de red.

Los modelos aprenden del historial de trabajos para predecir el tiempo de ejecución, recomendar tamaños de división y cantidad de reductores, y detectar desviaciones en los valores de los contadores. También señalan los trabajos cuyos contadores de registros desviados o tareas fallidas se salen del rango normal para esa canalización.

Copilot genera esqueletos plausibles para mappers y reducers, pero mezcla libremente el antiguo paquete mapred con el nuevo paquete mapreduce en una misma clase, lo que provocará un error de compilación. Corrija las importaciones y las firmas de los métodos antes de confiar en la lógica.

Es el mecanismo que envía el archivo más pequeño a cada nodo antes de que comiencen las tareas. Cada mapeador carga esa copia en un mapa hash y busca coincidencias localmente, lo que hace posible la unión del lado del mapeador.

Se imprimen en el resumen de la consola cuando finaliza la tarea, se muestran en el historial de tareas y en las páginas web del administrador de recursos, y se pueden leer mediante programación desde el objeto de la tarea, de modo que un controlador puede verificarlas y hacer que falle una ejecución incorrecta.

Un único objeto Context. Este objeto realiza el trabajo que antes se repartía entre OutputCollector y Reporter, de modo que la salida se escribe y los contadores se incrementan mediante el mismo identificador que se pasa al método map.

Para la mayoría de los trabajos de reportaje, no. A HiveQL unirse Se compila en el mismo patrón de mezcla y fusión en pocas líneas. Los trabajos escritos a mano merecen la pena cuando la lógica de fusión no se ajusta a una cláusula SQL.

Hadoop se niega a escribir en un directorio de salida que ya existe, lo que protege los resultados finales de ser sobrescritos. Elimine el directorio recursivamente primero o especifique una ruta de salida diferente en la siguiente ejecución.

Resumir este post con: