Què és MapReduce?
MapReduce és un model de programació i una plataforma de processament de dades distribuïdes desenvolupada per Google. És una de les peces fonamentals de l'ecosistema Hadoop i permet processar grans volums de dades de manera paral·lela i distribuïda. El model es basa en dos passos principals: Map i Reduce.
Components clau de MapReduce
- Map: Aquest pas pren un conjunt de dades d'entrada i el transforma en un conjunt de parells clau-valor intermedi.
- Shuffle and Sort: Aquest pas reordena els parells clau-valor intermedis per clau, agrupant tots els valors associats amb la mateixa clau.
- Reduce: Aquest pas pren els parells clau-valor intermedis agrupats i els processa per produir el conjunt de dades de sortida final.
Funcionament de MapReduce
Pas 1: Map
El pas Map és responsable de processar les dades d'entrada i generar parells clau-valor intermedis. Cada registre d'entrada és processat per una funció Map que genera zero o més parells clau-valor intermedis.
Exemple de codi Map:
public class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable> { private final static IntWritable one = new IntWritable(1); private Text word = new Text(); public void map(LongWritable 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); } } }
Explicació:
- LongWritable key: La clau d'entrada, que és la posició del registre dins del fitxer.
- Text value: El valor d'entrada, que és una línia de text.
- Context context: L'objecte que permet escriure els parells clau-valor intermedis.
- StringTokenizer: Divideix la línia de text en paraules.
- context.write(word, one): Escriu cada paraula com a clau i el número 1 com a valor.
Pas 2: Shuffle and Sort
Aquest pas és gestionat automàticament pel framework Hadoop. Reordena els parells clau-valor intermedis per clau i els agrupa.
Pas 3: Reduce
El pas Reduce pren els parells clau-valor intermedis agrupats i els processa per produir el conjunt de dades de sortida final. La funció Reduce rep una clau i una llista de valors associats amb aquesta clau.
Exemple de codi Reduce:
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)); } }
Explicació:
- Text key: La clau d'entrada, que és una paraula.
- Iterable
values : La llista de valors associats amb la clau. - context.write(key, new IntWritable(sum)): Escriu la clau i la suma dels valors com a sortida.
Flux de treball d'una feina MapReduce
- Lectura de dades d'entrada: Les dades d'entrada es llegeixen des del sistema de fitxers distribuït (HDFS).
- Execució del pas Map: Les dades d'entrada es divideixen en fragments i es processen en paral·lel per les funcions Map.
- Shuffle and Sort: Els parells clau-valor intermedis es reordenen i agrupen per clau.
- Execució del pas Reduce: Els parells clau-valor agrupats es processen per les funcions Reduce.
- Escritura de dades de sortida: Les dades de sortida es guarden al sistema de fitxers distribuït (HDFS).
Exercici pràctic
Objectiu
Implementar un programa MapReduce per comptar la freqüència de paraules en un conjunt de documents.
Passos
- Escriu la classe Mapper per dividir les línies de text en paraules.
- Escriu la classe Reducer per sumar les freqüències de les paraules.
- Configura i executa la feina MapReduce.
Solució
Classe Mapper:
public class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable> { private final static IntWritable one = new IntWritable(1); private Text word = new Text(); public void map(LongWritable 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); } } }
Classe Reducer:
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)); } }
Classe Driver:
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); } }
Execució
- Compila les classes Java.
- Executa la feina MapReduce amb les dades d'entrada i la ruta de sortida especificades.
Conclusió
En aquesta secció, hem introduït el model de programació MapReduce, hem explicat els passos clau del seu funcionament i hem proporcionat un exemple pràctic de comptatge de paraules. Aquest coneixement és fonamental per comprendre com processar grans volums de dades de manera eficient amb Hadoop. En la següent secció, explorarem el flux de treball d'una feina MapReduce en més detall.
Curs de Hadoop
Mòdul 1: Introducció a Hadoop
- Què és Hadoop?
- Visió general de l'ecosistema Hadoop
- Hadoop vs Bases de dades tradicionals
- Configuració de l'entorn Hadoop
Mòdul 2: Arquitectura de Hadoop
- Components bàsics de Hadoop
- HDFS (Sistema de fitxers distribuït de Hadoop)
- Marc MapReduce
- YARN (Yet Another Resource Negotiator)
Mòdul 3: HDFS (Sistema de fitxers distribuït de Hadoop)
Mòdul 4: Programació MapReduce
- Introducció a MapReduce
- Flux de treball d'una feina MapReduce
- Escriure un programa MapReduce
- Tècniques d'optimització de MapReduce
Mòdul 5: Eines de l'ecosistema Hadoop
Mòdul 6: Conceptes avançats de Hadoop
- Seguretat de Hadoop
- Gestió de clústers de Hadoop
- Ajust de rendiment de Hadoop
- Serialització de dades de Hadoop
Mòdul 7: Aplicacions reals i estudis de cas
- Hadoop en emmagatzematge de dades
- Hadoop en aprenentatge automàtic
- Hadoop en processament de dades en temps real
- Estudis de cas d'implementacions de Hadoop