Introducció
En aquest tema, explorarem MapReduce i Hadoop, dues tecnologies fonamentals per al processament de grans volums de dades. MapReduce és un model de programació que permet el processament paral·lel de grans conjunts de dades, mentre que Hadoop és un marc de treball que implementa aquest model i proporciona una infraestructura robusta per al processament distribuït.
Objectius
- Entendre el concepte de MapReduce i com funciona.
- Aprendre sobre l'arquitectura de Hadoop i els seus components principals.
- Implementar un exemple pràctic de MapReduce utilitzant Hadoop.
Conceptes Clau
MapReduce
MapReduce és un model de programació desenvolupat per Google per processar grans conjunts de dades de manera paral·lela. Consta de dues fases principals:
-
Map: Aquesta fase pren un conjunt de dades d'entrada i el divideix en parelles clau-valor. Cada parella és processada per una funció de map que genera una llista intermèdia de parelles clau-valor.
-
Reduce: Aquesta fase pren la llista intermèdia generada per la fase de map i combina les parelles clau-valor amb la mateixa clau per produir el resultat final.
Hadoop
Hadoop és un marc de treball de codi obert que implementa el model de MapReduce i proporciona una infraestructura per al processament distribuït de grans volums de dades. Els components principals de Hadoop són:
- Hadoop Distributed File System (HDFS): Un sistema de fitxers distribuït que emmagatzema les dades en múltiples màquines.
- YARN (Yet Another Resource Negotiator): Un sistema de gestió de recursos que coordina l'execució de les aplicacions.
- MapReduce: El motor de processament que executa les tasques de MapReduce.
Arquitectura de Hadoop
A continuació es mostra una taula que resumeix els components principals de Hadoop i les seves funcions:
Component | Funció |
---|---|
HDFS | Emmagatzematge distribuït de dades |
YARN | Gestió de recursos i planificació de tasques |
MapReduce | Processament de dades en paral·lel |
Exemple Pràctic de MapReduce amb Hadoop
Pas 1: Instal·lació de Hadoop
Abans de començar, assegura't de tenir Hadoop instal·lat i configurat al teu sistema. Pots seguir la guia oficial d'instal·lació de Hadoop.
Pas 2: Escriptura del Codi MapReduce
A continuació es mostra un exemple de codi MapReduce en Java per comptar la freqüència de paraules en un conjunt de dades:
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.Mapper; import org.apache.hadoop.mapreduce.Reducer; import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; import java.io.IOException; import java.util.StringTokenizer; public class WordCount { public static class TokenizerMapper 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 { StringTokenizer itr = new StringTokenizer(value.toString()); while (itr.hasMoreTokens()) { word.set(itr.nextToken()); context.write(word, one); } } } public static class IntSumReducer extends Reducer<Text, IntWritable, Text, IntWritable> { private IntWritable result = new IntWritable(); public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException { int sum = 0; for (IntWritable val : values) { sum += val.get(); } result.set(sum); context.write(key, result); } } 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(TokenizerMapper.class); job.setCombinerClass(IntSumReducer.class); job.setReducerClass(IntSumReducer.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); } }
Pas 3: Execució del Codi MapReduce
- Compila el codi Java:
javac -classpath `hadoop classpath` -d wordcount_classes WordCount.java jar -cvf wordcount.jar -C wordcount_classes/ .
- Executa el treball MapReduce:
Exercicis Pràctics
Exercici 1: Comptar la Freqüència de Paraules
Modifica el codi de l'exemple per comptar la freqüència de paraules en un conjunt de dades diferent. Prova amb un text més gran i observa com Hadoop maneja el processament distribuït.
Exercici 2: Anàlisi de Logs
Implementa un treball MapReduce per analitzar logs de servidor web i comptar el nombre de visites per cada adreça IP.
Solucions
Solució a l'Exercici 1
Segueix els mateixos passos que en l'exemple pràctic, però utilitza un fitxer de text diferent com a entrada.
Solució a l'Exercici 2
- Escriu un Mapper que extregui l'adreça IP de cada línia de log.
- Escriu un Reducer que compti el nombre de visites per cada adreça IP.
- Compila i executa el treball MapReduce de manera similar a l'exemple pràctic.
Resum
En aquest tema, hem après sobre el model de programació MapReduce i el marc de treball Hadoop. Hem explorat la seva arquitectura i components principals, i hem implementat un exemple pràctic de MapReduce utilitzant Hadoop. A més, hem proposat exercicis pràctics per reforçar els conceptes apresos. En el proper tema, explorarem Apache Spark, una altra tecnologia clau per al processament de Big Data.