Introducción
Los archivos de productos de la empresa minorista están organizados y son accesibles. Ahora puede responder a la pregunta del primer laboratorio: ¿qué etiquetas de productos aparecen con mayor frecuencia? Podría contar unas pocas líneas a mano, pero una colección creciente necesita un cálculo repetible.
MapReduce es una forma de organizar un cálculo por lotes. Map transforma los registros de entrada en pares clave/valor; Shuffle reúne los valores de la misma clave; Reduce combina los valores de cada clave en un resultado. En WordCount, la clave es una etiqueta de producto y cada aparición aporta el valor 1. Contar palabras es un ejemplo pequeño que permite ver el flujo de datos, no un sistema completo de análisis de ventas.
Examinará estas etapas con una herramienta didáctica preparada y después ejecutará un programa real de Hadoop WordCount, ya compilado, sobre la misma entrada. La herramienta didáctica imprime las etapas del algoritmo en un proceso; no es un registro de ejecución distribuida. La ejecución de Hadoop utiliza el modo local para que pueda centrarse en el cálculo antes de trasladar el mismo algoritmo a YARN en el próximo laboratorio. No se requiere programación en Java ni Python.
Transforme etiquetas de productos en pares clave/valor
En este paso, examinará la entrada y seguirá cada aparición de producto a través de Map.
Comience en el espacio de trabajo local:
cd /home/labex/project
Lea las seis líneas de entrada:
cat /home/labex/project/data/product-words.txt
Texto esperado:
notebook pen
notebook folder
pen pen
folder notebook
notebook
folder pen
Deténgase y cuente un producto a mano. notebook aparece en cuatro líneas, una vez en cada una; pen aparece cuatro veces en total, incluidas dos en la tercera línea. folder aparece tres veces. El programa debería producir esos mismos totales.
Un par clave/valor asocia una etiqueta con un valor. En este algoritmo, Map emite (product, 1) por cada aparición, donde product representa el producto. Dos apariciones de pen crean dos pares separados, no un par por línea de entrada.
El ejecutable wordcount-stages proporcionado acepta un nombre de etapa y un archivo local de entrada. Utilice su vista map:
/home/labex/project/tools/wordcount-stages map /home/labex/project/data/product-words.txt
La salida comienza con:
notebook 1
pen 1
notebook 1
folder 1
El espacio entre cada clave y valor es una tabulación. Hay once pares, uno por cada aparición de producto. Esta herramienta hace visible el algoritmo; no inicia servicios de Hadoop ni planifica tareas. Guarde la salida de la etapa:
/home/labex/project/tools/wordcount-stages map /home/labex/project/data/product-words.txt > /home/labex/project/output/map-pairs.txt
Ha cambiado la representación de la entrada: las líneas completas se convirtieron en aportaciones que pueden agruparse por producto.
Agrupe y reduzca las aportaciones
En este paso, seguirá los pares a través de Shuffle y Reduce y relacionará la salida con su predicción manual.
Map emite aportaciones separadas. Para obtener el total de un producto, sus aportaciones deben reunirse. Shuffle y la ordenación organizan los pares por clave para que un reductor pueda recibir los valores de un producto concreto. En un trabajo distribuido esto puede implicar transferir datos entre tareas; la herramienta didáctica únicamente muestra los valores agrupados.
Examine la vista agrupada:
/home/labex/project/tools/wordcount-stages shuffle /home/labex/project/data/product-words.txt
Valores agrupados esperados:
folder 1,1,1
notebook 1,1,1,1
pen 1,1,1,1
Las claves están ordenadas. Cada 1 separado por comas sigue representando una aparición original, no un registro nuevo. Guarde la agrupación:
/home/labex/project/tools/wordcount-stages shuffle /home/labex/project/data/product-words.txt > /home/labex/project/output/shuffled-values.txt
Reduce combina los valores de cada clave. Aquí suma los enteros. Otra aplicación podría combinar los valores de otra forma; MapReduce no se limita a contar.
Examine la vista reducida:
/home/labex/project/tools/wordcount-stages reduce /home/labex/project/data/product-words.txt
Resultados esperados:
folder 3
notebook 4
pen 4
Compare estos valores con los conteos manuales del paso 1. Guarde el resultado para poder compararlo a continuación con la aplicación real de Hadoop:
/home/labex/project/tools/wordcount-stages reduce /home/labex/project/data/product-words.txt > /home/labex/project/output/teaching-counts.txt
El resultado depende de todas las apariciones de cada clave, incluso cuando las apariciones originales estaban en líneas diferentes. Por eso la etapa de agrupación se sitúa entre Map y Reduce.
Ejecute el programa real Hadoop WordCount
En este paso, ejecutará la misma tarea de conteo con un ejemplo de Hadoop ya compilado en modo local.
Un JAR empaqueta código de programas Java. Hadoop y su JAR de ejemplos ya están instalados, por lo que no necesita compilar código. hadoop jar ejecuta el JAR indicado; wordcount selecciona su ejemplo WordCount. Los dos ajustes -D siguientes seleccionan el marco de ejecución local y el sistema de archivos local para esta invocación. Los dos argumentos finales son el archivo de entrada y un directorio nuevo de salida:
hadoop jar /opt/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.5.0.jar wordcount -Dmapreduce.framework.name=local -Dfs.defaultFS=file:/// /home/labex/project/data/product-words.txt /home/labex/project/output/local-wordcount
Espere al indicador de comandos. Hadoop imprime mensajes de progreso y diagnóstico; las rutas, los identificadores y los tiempos varían. Este es un programa real de Hadoop que utiliza el ejecutor local, no una aplicación de YARN. El laboratorio no inicia servicios de HDFS ni YARN, y tanto la entrada como la salida son locales.
Liste el directorio local de salida:
ls /home/labex/project/output/local-wordcount
Debería ver un marcador _SUCCESS y un archivo de resultados part-.... _SUCCESS indica que se completó correctamente la salida, mientras que el archivo de resultados contiene los datos que debe comprobar. El patrón part-* del shell local selecciona los archivos de resultados. Pase sus contenidos combinados por sort para estabilizar la comparación:
cat /home/labex/project/output/local-wordcount/part-* | sort > /home/labex/project/output/hadoop-counts.txt
Compárelos con los conteos de la herramienta didáctica:
diff /home/labex/project/output/teaching-counts.txt /home/labex/project/output/hadoop-counts.txt
No debería aparecer ninguna diferencia. Ha relacionado el algoritmo explicado con la salida de un programa real. Si el directorio de salida de esta ejecución ya existe, examine sus archivos completados en lugar de eliminarlo a ciegas o suponer que un envío repetido los sobrescribirá.
Una distinción será importante más adelante: un bloque de HDFS almacena bytes, una división de entrada (input split) describe una unidad de trabajo de entrada y una tarea ejecuta trabajo. Están relacionados, pero no siempre se corresponden uno a uno. Los archivos de resultados son salidas de tareas de procesamiento, no copias de los bloques de almacenamiento originales.
Prediga y pruebe un cambio en la entrada
En este paso, añadirá una aparición de producto a una copia de trabajo y comprobará qué resultado cambia.
Mantenga sin cambios la entrada original de solo lectura. Utilice el comando local cat con > para escribir una nueva copia de trabajo que permita escritura. Ambas rutas son locales; el archivo de salida será el que modificará:
cat /home/labex/project/data/product-words.txt > /home/labex/project/output/changed-product-words.txt
Prediga los nuevos conteos si añade una aparición de notebook: solo su total debería aumentar, de 4 a 5. printf imprime el texto proporcionado, \n significa un salto de línea y >> añade la salida en lugar de sustituir el contenido existente:
printf 'notebook\n' >> /home/labex/project/output/changed-product-words.txt
Examine la entrada modificada:
cat /home/labex/project/output/changed-product-words.txt
Debería haber una nueva línea final. Ejecute el mismo programa de Hadoop cambiando únicamente las rutas de entrada y salida:
hadoop jar /opt/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.5.0.jar wordcount -Dmapreduce.framework.name=local -Dfs.defaultFS=file:/// /home/labex/project/output/changed-product-words.txt /home/labex/project/output/changed-wordcount
Lea los resultados reales ordenados:
cat /home/labex/project/output/changed-wordcount/part-* | sort
Resultados esperados:
folder 3
notebook 5
pen 4
El nuevo par de Map pertenece al grupo notebook, por lo que solo cambia ese total de Reduce. Ahora puede explicar el resultado en lugar de limitarse a reconocer un comando correcto. En el próximo laboratorio, el algoritmo y las reglas de conteo seguirán siendo los mismos, mientras HDFS proporciona la entrada y YARN administra los recursos de ejecución.
Resumen
Siguió las apariciones de productos hasta los pares de Map, agrupó los valores mediante Shuffle y los combinó mediante Reduce. Los resultados reales de Hadoop WordCount coincidieron con su cálculo manual y con la herramienta didáctica, y después cambiaron de la forma prevista al añadir una aparición en la entrada.
Utilizó el ejecutor local para aislar el algoritmo. A continuación, conservará ese algoritmo y aprenderá cómo una aplicación real de YARN lee entradas de HDFS y produce resultados en HDFS.



