Volver a la página principal
lunes 18 noviembre 2024
5

Cómo usar MapReduce en Hadoop

MapReduce es un modelo de programación para procesar grandes volúmenes de datos distribuidos en un clúster. Es una de las principales herramientas de Hadoop, diseñada para manejar tareas de procesamiento masivo de datos en paralelo y de forma eficiente.

¿Qué es MapReduce?

MapReduce divide el procesamiento de datos en dos fases principales:

1. Map: Aplica una función a cada fragmento de datos (entrada) para generar pares clave-valor intermedios.

2. Reduce: Combina los pares clave-valor intermedios con la misma clave para producir un conjunto más pequeño de resultados.

Características principales

  • Escalabilidad: Diseñado para funcionar en clústeres con cientos o miles de nodos.
  • Tolerancia a fallos: Maneja fallos de nodos automáticamente.
  • Paralelismo: Divide las tareas en subprocesos que se ejecutan simultáneamente.

Arquitectura de MapReduce

Fases de ejecución

1. Fase Map:

  • Divide el trabajo en tareas más pequeñas que procesan los datos localmente.
  • Produce pares clave-valor intermedios.

2. Shuffle and Sort:

  • Ordena y agrupa los pares clave-valor generados en la fase Map.
  • Asegura que todas las claves iguales lleguen a un único reducer.

3. Fase Reduce:

  • Toma los datos agrupados y realiza operaciones de agregación o reducción para generar resultados finales.

Flujo de trabajo

1. Input: Los datos de entrada se dividen en bloques por el sistema HDFS (Hadoop Distributed File System).

2. Map: Cada bloque se asigna a un nodo donde se ejecuta la función Map.

3. Shuffle and Sort: Los datos intermedios se transfieren entre nodos para agruparse por clave.

4. Reduce: Los nodos Reducer procesan los datos agrupados para generar la salida final.

5. Output: Los resultados se almacenan en HDFS.

Implementación de MapReduce

Ejemplo: Contar palabras en un archivo

Este es uno de los ejemplos más comunes para ilustrar MapReduce. Se cuenta el número de ocurrencias de cada palabra en un archivo de texto.

1. Escribir el código

En Hadoop, puedes usar Java para escribir programas MapReduce. A continuación, se describe una implementación básica.

Clase Mapper

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

import java.io.IOException;

public class WordCountMapper extends Mapper<Object, Text, Text, IntWritable> {
    private final static IntWritable one = new IntWritable(1);
    private Text word = new Text();

    public void map(Object key, Text value, Context context) throws IOException, InterruptedException {
        String[] words = value.toString().split("\\s+");
        for (String w : words) {
            word.set(w);
            context.write(word, one);
        }
    }
}

Clase Reducer

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;

import java.io.IOException;

public class WordCountReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
    public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
        int sum = 0;
        for (IntWritable val : values) {
            sum += val.get();
        }
        context.write(key, new IntWritable(sum));
    }
}

Clase Driver

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

public class WordCount {
    public static void main(String[] args) throws Exception {
        Configuration conf = new Configuration();
        Job job = Job.getInstance(conf, "word count");
        job.setJarByClass(WordCount.class);
        job.setMapperClass(WordCountMapper.class);
        job.setCombinerClass(WordCountReducer.class);
        job.setReducerClass(WordCountReducer.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);
        FileInputFormat.addInputPath(job, new Path(args[0]));
        FileOutputFormat.setOutputPath(job, new Path(args[1]));
        System.exit(job.waitForCompletion(true) ? 0 : 1);
    }
}

2. Ejecutar el programa MapReduce

Pasos para ejecutar el programa:

1. Compilar el código Java:

javac -cp $(hadoop classpath) -d wordcount_classes WordCountMapper.java WordCountReducer.java WordCount.java
   jar -cvf wordcount.jar -C wordcount_classes/ .

2. Preparar datos de entrada en HDFS:

hadoop fs -mkdir /input
   hadoop fs -put archivo.txt /input

3. Ejecutar el programa MapReduce:

hadoop jar wordcount.jar WordCount /input /output

4. Ver los resultados:

hadoop fs -cat /output/part-r-00000

Ventajas de MapReduce

1. Procesamiento paralelo: Divide las tareas en partes pequeñas, ejecutadas en paralelo en múltiples nodos.

2. Escalabilidad: Escala eficientemente en clústeres grandes.

3. Tolerancia a fallos: Reintenta tareas fallidas automáticamente.

Limitaciones de MapReduce

1. Complejidad: Su modelo de programación puede ser más complicado que alternativas como Spark.

2. Latencia: No es ideal para procesamiento en tiempo real.

3. Restricciones en iteraciones: No es eficiente para algoritmos que requieren múltiples iteraciones.

Referencias oficiales

Compartir:
Creado por:
Author photo

Jorge García

Fullstack developer