Travaux pratiques (TP – 03)
Programme WordCount avec MapReduce
Objectifs
▪ Comprendre et implémenter un programme de comptage de mots en utilisant le modèle
MapReduce sous Hadoop.
Prérequis :
▪ Hadoop installé et configuré.
▪ Accès au HDFS.
▪ Familiarité avec Java (ou le langage utilisé pour implémenter MapReduce).
Étapes du TP :
1. Présentation du TP
Le programme WordCount est un classique pour commencer avec Hadoop MapReduce. Le but est de
lire un fichier texte, de compter le nombre d'occurrences de chaque mot, et d'afficher le résultat.
2. Création des Classes Map et Reduce
a. Classe Map
La classe Map va lire chaque ligne du fichier, découper la ligne en mots, puis émettre un couple clé-
valeur pour chaque mot, où la clé est le mot et la valeur est 1.
import java.io.IOException;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
public class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable> {
private final static IntWritable one = new IntWritable(1);
private Text word = new Text();
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException,
InterruptedException {
String line = value.toString();
String[] words = line.split("\\s+");
for (String w : words) {
word.set(w);
context.write(word, one);
}
}
}
Explications :
• LongWritable : représente le décalage de la ligne dans le fichier d'entrée.
• Text : représente le texte de la ligne.
• IntWritable : représente la valeur 1 pour chaque mot.
b. Classe Reduce
La classe Reduce va recevoir les couples clé-valeur émis par le Mapper, regrouper toutes les
occurrences d’un mot et calculer le total.
import java.io.IOException;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
public class WordCountReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
@Override
protected 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));
}
}
Explications :
• La méthode reduce additionne toutes les valeurs associées à une clé (mot) pour obtenir le
nombre total d'occurrences de chaque mot.
3. Configuration et Lancement du Job MapReduce
Classe WordCount
Cette classe configure le Job MapReduce et lance le traitement.
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); // Optionnel, pour optimiser
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);
}
}
4. Compilation et Exécution du Programme
Compilation : Compilez les fichiers Java en un fichier .jar (par exemple, WordCount.jar).
javac -classpath `hadoop classpath` -d . WordCountMapper.java WordCountReducer.java
WordCount.java
jar -cvf WordCount.jar -C . .
Téléchargement du fichier d'entrée dans HDFS : Téléchargez le fichier que vous souhaitez analyser
dans le HDFS.
hadoop fs -mkdir -p /user/nom_utilisateur/input
hadoop fs -put votre_fichier.txt /user/nom_utilisateur/input
Exécution du Job MapReduce : Exécutez le programme WordCount avec Hadoop
hadoop jar WordCount.jar WordCount /user/nom_utilisateur/input /user/nom_utilisateur/output
Visualisation des Résultats : Affichez les résultats du job.
hadoop fs -cat /user/nom_utilisateur/output/part-r-00000
5. Questions :
1. Pourquoi utilise-t-on MapReduce pour le traitement de gros volumes de données ?
2. Comment l'opération de shuffle (mélange) contribue-t-elle à l'efficacité du traitement
distribué ?
3. Pourquoi l'utilisation d'un combiner peut-elle améliorer les performances d'un job
MapReduce ?
6. Extension
1. Modifiez le programme pour qu'il ignore les mots courts (moins de trois lettres).
2. Ajoutez un filtre pour ne compter que les mots apparaissant plus de deux fois.