El viaje de transformación de datos sobrenatural

HadoopHadoopBeginner
Practicar Ahora

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

En este laboratorio, aprenderá a personalizar los formatos de salida y entrada en Hadoop MapReduce para procesar datos de manera efectiva. Con la instrucción guiada del Ghost Tutor, adquirirá las habilidades para trabajar con diferentes tipos de datos y desbloquear todo el potencial del ecosistema Hadoop. Prepárese para emprender un emocionante viaje para dominar el arte de la computación en el reino sobrenatural.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL hadoop(("Hadoop")) -.-> hadoop/HadoopMapReduceGroup(["Hadoop MapReduce"]) hadoop(("Hadoop")) -.-> hadoop/HadoopYARNGroup(["Hadoop YARN"]) hadoop(("Hadoop")) -.-> hadoop/HadoopHiveGroup(["Hadoop Hive"]) hadoop/HadoopMapReduceGroup -.-> hadoop/setup_jobs("Setting up MapReduce Jobs") hadoop/HadoopMapReduceGroup -.-> hadoop/mappers_reducers("Coding Mappers and Reducers") hadoop/HadoopMapReduceGroup -.-> hadoop/handle_io_formats("Handling Output Formats and Input Formats") hadoop/HadoopYARNGroup -.-> hadoop/yarn_jar("Yarn Commands jar") hadoop/HadoopHiveGroup -.-> hadoop/import_export_data("Importing and Exporting Data") hadoop/HadoopHiveGroup -.-> hadoop/process("Process Control Function") hadoop/HadoopHiveGroup -.-> hadoop/storage_formats("Choosing Storage Formats") hadoop/HadoopHiveGroup -.-> hadoop/integration("Integration with HDFS and MapReduce") subgraph Lab Skills hadoop/setup_jobs -.-> lab-288974{{"El viaje de transformación de datos sobrenatural"}} hadoop/mappers_reducers -.-> lab-288974{{"El viaje de transformación de datos sobrenatural"}} hadoop/handle_io_formats -.-> lab-288974{{"El viaje de transformación de datos sobrenatural"}} hadoop/yarn_jar -.-> lab-288974{{"El viaje de transformación de datos sobrenatural"}} hadoop/import_export_data -.-> lab-288974{{"El viaje de transformación de datos sobrenatural"}} hadoop/process -.-> lab-288974{{"El viaje de transformación de datos sobrenatural"}} hadoop/storage_formats -.-> lab-288974{{"El viaje de transformación de datos sobrenatural"}} hadoop/integration -.-> lab-288974{{"El viaje de transformación de datos sobrenatural"}} end

Escribiendo el Mapper y el Reducer

En este paso, profundizaremos en el corazón de Hadoop MapReduce y crearemos nuestras propias clases Mapper y Reducer.

Explorar el archivo de datos

Primero, use el comando su - hadoop para cambiar de identidad. El archivo de datos data.txt se almacena en el directorio /user/hadoop/input de HDFS, que almacena el contenido de algunas conversaciones de personas. Use el siguiente comando para ver el contenido:

hdfs dfs -cat /user/hadoop/input/data.txt

Mapper personalizado

A continuación, crearemos una clase Mapper personalizada llamada WordCountMapper que extiende Mapper. Este Mapper procesará los datos de entrada y emitirá pares clave-valor, teniendo en cuenta que los datos procesados son el contenido de cada línea de la conversación, no los nombres de las personas. Consulte el siguiente ejemplo para completar el método map en WordCountMapper.java en /home/hadoop/.

@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
    // Convertir el objeto Text a una String
    String line = value.toString();
    // Tokenizar la cadena usando StringTokenizer
    StringTokenizer tokenizer = new StringTokenizer(line);
    // Iterar a través de cada token y escribirlos en el contexto
    while (tokenizer.hasMoreTokens()) {
        // Establecer la palabra actual
        word.set(tokenizer.nextToken().trim());
        // Escribir la palabra y su conteo en el contexto
        context.write(word, one);
    }
}

Luego use el siguiente comando para compilar el código en la versión de java 8:

javac -source 8 -target 8 -cp $HADOOP_HOME/share/hadoop/common/hadoop-common-3.3.6.jar:$HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-client-core-3.3.6.jar:. WordCountMapper.java

Reducer personalizado

Finalmente, crearemos una clase Reducer personalizada llamada WordCountReducer que extiende Reducer. Este Reducer agregará los valores para cada clave y emitirá el resultado final. Complete el método reduce en WordCountReducer.java en /home/hadoop/ con el siguiente ejemplo.

@Override
protected void reduce(Text key, Iterable<IntWritable> values, Context context)
        throws IOException, InterruptedException {
    // Inicializar una variable para almacenar la suma de los conteos para cada palabra
    int sum = 0;
    // Iterar a través de todos los conteos para la palabra actual y calcular la suma total
    for (IntWritable value : values) {
        sum += value.get();
    }
    // Establecer el conteo final para la palabra actual
    result.set(sum);
    // Escribir la palabra y su conteo final en el contexto
    context.write(key, result);
}

Luego use el siguiente comando para compilar el código en la versión de java 8:

javac -source 8 -target 8 -cp $HADOOP_HOME/share/hadoop/common/hadoop-common-3.3.6.jar:$HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-client-core-3.3.6.jar:. WordCountReducer.java

Escribiendo formatos de entrada y salida personalizados

En este paso, especificaremos los formatos de entrada y salida para el trabajo de MapReduce.

Formato de entrada personalizado

Primero, creemos un formato de entrada personalizado para leer datos de una fuente específica. Definiremos una clase llamada PersonInputFormat que extiende TextInputFormat y sobrescribirá el método getCurrentValue para manejar el formato de entrada. Complete el método getCurrentValue en PersonInputFormat.java en /home/hadoop/ con el siguiente ejemplo.

@Override
public synchronized Text getCurrentValue() {
    // Devolver el valor del registro actual, dividirlo según ":", eliminar los espacios en blanco del primer y último y establecerlo en el objeto Text.
    Text value = new Text();
    Text line = super.getCurrentValue();
    String[] parts = line.toString().split(":");
    if (parts.length == 2) {
        value.set(parts[1].trim());
    }
    return value;
}

Luego use el siguiente comando para compilar el código en la versión de java 8:

javac -source 8 -target 8 -cp $HADOOP_HOME/share/hadoop/common/hadoop-common-3.3.6.jar:$HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-client-core-3.3.6.jar:. PersonInputFormat.java

Formato de salida personalizado

A continuación, creemos un formato de salida personalizado. Definiremos una clase llamada CSVOutputFormat que extiende TextOutputFormat. Complete el método write en CSVOutputFormat.java en /home/hadoop/ con el siguiente ejemplo.

// Escribir el par clave-valor en el flujo de salida en formato CSV
@Override
public void write(Text key, IntWritable value) throws IOException, InterruptedException {
    out.writeBytes(key.toString() + "," + value.toString() + "\n");
}

Luego use el siguiente comando para compilar el código en la versión de java 8:

javac -source 8 -target 8 -cp $HADOOP_HOME/share/hadoop/common/hadoop-common-3.3.6.jar:$HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-client-core-3.3.6.jar:. CSVOutputFormat.java

Integrando con el Controlador

En este último paso, modificaremos la clase WordCountDriver para utilizar los formatos de entrada y salida personalizados que creamos anteriormente.

Controlador personalizado

Complete la función main de WordCountDriver.java en /home/hadoop/ con el siguiente ejemplo.

// Establecer las clases Mapper y Reducer
job.setMapperClass(WordCountMapper.class);
job.setReducerClass(WordCountReducer.class);

// Establecer la clase de formato de entrada al formato de entrada personalizado PersonInputFormat
job.setInputFormatClass(PersonInputFormat.class);

// Establecer la clase de formato de salida al formato de salida personalizado CSVOutputFormat
job.setOutputFormatClass(CSVOutputFormat.class);

Ejecutando el trabajo

Para ejecutar el trabajo de Hadoop MapReduce con los formatos de entrada y salida personalizados, siga estos pasos:

  1. Compile WordCountDriver.java usando las dependencias de Hadoop adecuadas.

    javac -source 8 -target 8 -cp $HADOOP_HOME/share/hadoop/common/hadoop-common-3.3.6.jar:$HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-client-core-3.3.6.jar:. WordCountDriver.java
  2. Cree un archivo JAR que contenga las clases compiladas.

    jar -cvf mywordcount.jar *.class
  3. Ejecute la clase WordCountDriver con las rutas de entrada y salida adecuadas. Asegúrese de que la ruta de salida no exista previamente.

    hadoop jar./mywordcount.jar WordCountDriver /user/hadoop/input /output

Este comando ejecutará el trabajo de Hadoop MapReduce usando los formatos de entrada y salida personalizados que definimos.

Ver los resultados de la salida

Use el siguiente comando para comprobar si el archivo de resultado se generó correctamente:

hdfs dfs -ls /output
hdfs dfs -cat /output/part.csv

Resumen

¡Felicidades! En este laboratorio, has explorado con éxito las complejidades de Hadoop MapReduce y dominado la personalización de los formatos de salida y entrada bajo la guía del Ghost Tutor. Desde la creación de clases Mapper y Reducer hasta superar desafíos como el manejo de archivos de entrada no divisible, has adquirido valiosos conocimientos. A través de ejercicios prácticos, has profundizado tu comprensión de las capacidades de Hadoop MapReduce y ahora estás capacitado para enfrentar retos de datos con confianza. Este viaje no solo ha mejorado tus habilidades técnicas, sino que también ha ampliado tu perspectiva sobre el potencial de Hadoop MapReduce para el procesamiento de grandes cantidades de datos.