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.
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.
1. Fase Map:
2. Shuffle and Sort:
3. Fase Reduce:
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.
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.
En Hadoop, puedes usar Java para escribir programas MapReduce. A continuación, se describe una implementación básica.
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);
}
}
}
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));
}
}
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);
}
}
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
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.
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.
Jorge García
Fullstack developer