BIG DATA ANNÉE UNIVERSITAIRE 2024-2025
TP2:Programmation avec l’API
Mapreduce
L’objectif de ce TP est de :
Lancer le cluster hadoop
s’initier à la programmation avec mapreduce
1. démarrer le cluster hadoop
Démarrer les trois containers arrêtés précédemment
docker start haoop-master hadoop-slave1 hadoop-slave2
A la fin du démarrage, vérifier si les interfaces web correspondantes ont démarré
correctement. Pour ce faire Dans un navigateur, entrer les adresses :
[Link]
L’interface utilisateur ressource manager permet de surveiller et de gérer votre cluster Yarn
[Link]
l'interface utilisateur Web NameNode permet d’accéder aux informations de votre cluster hadoop (le
nombre de nœuds, espace de stockage, le contenu du système de fichiers HDFS)
L’objectif de ce TP est de simuler l’exemple wordcount vu dans le cours
2. classe Mapper
Créer une première classe Mapper
package [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
public 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 {
[Link]([Link]());
YASSER EL MADANI EL ALAMI 1
BIG DATA ANNÉE UNIVERSITAIRE 2024-2025
StringTokenizer itr = new
StringTokenizer([Link]());
while ([Link]()) {
[Link]([Link]());
[Link](word, one);
}
}
}
3. classe reducer
Créer une la classe reducer
package [Link];
import [Link];
import [Link];
import [Link];
import [Link];
public 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 += [Link]();
}
[Link](sum);
[Link](key, result);
}
}
4. classe Principale
Créer une la classe qui permettra de lancer le job
package [Link];
import [Link];
import [Link];
import [Link];
import [Link];
YASSER EL MADANI EL ALAMI 2
BIG DATA ANNÉE UNIVERSITAIRE 2024-2025
import [Link];
import [Link];
import [Link];
import
[Link];
public class WordCount {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
Configuration conf = new Configuration();
Job job = [Link](conf, "word count");
// classe principale
[Link]([Link]);
// classe qui fait le map
[Link]([Link]);
// classe qui fait le shuffling et le reduce
[Link]([Link]);
[Link]([Link]);
[Link]([Link]);
[Link]([Link]);
// spécifier le fichier d'entrée
[Link](job, new Path(args[0]));
// spécifier le fichier contenant le résultat
[Link](job, new
Path(args[1]));
[Link]([Link](true) ? 0 : 1);
}
}
Créer un fichier jar que vous allez nommer [Link]
Copier le jar créé vers le dossier de partage /hadoop_project
sur l’invité de commande shell de votre container lancer la commande
5. MapReduce avec python
.L’objectif est d’implémenter le fameux exemple wordcount à base de mapreduce en python et
de l’utilitaire hadoop streaming. pour ce faire :
YASSER EL MADANI EL ALAMI 3
BIG DATA ANNÉE UNIVERSITAIRE 2024-2025
Écrire le mapper qui implémente la logique map. Il lira les données de STDIN et
divisera les lignes en mots, et générera une sortie de chaque mot avec une occurrence
égale à 1
#!/usr/bin/env python
import sys
# input comes from standard input STDIN
for line in [Link]:
line = [Link]() #remove leading and trailing whitespaces
words = [Link]() #split the line into words and returns as a list
for word in words:
#write the results to standard output STDOUT
print'%s\t%s' % (word,1) #print the results
Vous pouvez tester le [Link] sur votre machine
cat [Link] | python [Link]
Écrire le fichier [Link] qui implémente la logique reduce. Il lira la sortie de
[Link] à partir de l’entrée standard et agrégera l'occurrence de chaque mot et
écrira la sortie finale sur STDOUT
#!/usr/bin/env python
from operator import itemgetter
import sys
current_word = None
current_count = 0
word = None
for line in [Link]:
line = [Link]() # remove leading and trailing whitespace
# splitting the data on the basis of tab provided in [Link]
word, count = [Link]('\t', 1)
# convert count (currently a string) to int
try:
count = int(count)
except ValueError:# ignore/discard this line if count is not a number
continue
# Hadoop sorts map output by key (word) before it is passed to the reducer
if current_word == word:
current_count += count
else:
if current_word:
# write result to STDOUT
print '%s \t %s' % (current_word, current_count)
current_count = count
current_word = word
# output the last word
YASSER EL MADANI EL ALAMI 4
BIG DATA ANNÉE UNIVERSITAIRE 2024-2025
if current_word == word:
print '%s\t%s' % (current_word, current_count)
Vérifier si le reducer fonctionne correctement
cat [Link] | python [Link] | sort -k1,1 | python [Link]
pour exécuter le [Link] et [Link],
1. ouvrir le terminal du container master
2. localiser le fichier JAR de l’utilitaire hadoop streaming.
find / -name 'hadoop-streaming*.jar'
Le chemin devrait ressembler à PATH/[Link]
/opt/hadoop-3.2.1/share/hadoop/tools/lib/[Link]
3. finalement exécuter le programme map/reduce avec la commande suivante
hadoop jar /opt/hadoop-3.2.1/share/hadoop/tools/lib/hadoop-streaming-
[Link] \
-file chemin/[Link] -mapper [Link] \
-file chemin/[Link] -reducer [Link] \
-input chemin/input -output chemin/output
3. sortir du bash hadoop-master
4. arrêter les containers
YASSER EL MADANI EL ALAMI 5