Écrire le Mapper et le Reducer
Dans cette étape, nous plongerons au cœur de Hadoop MapReduce et créerons nos propres classes Mapper et Reducer.
Explorer le fichier de données
Tout d'abord, utilisez la commande su - hadoop
pour basculer d'identité. Le fichier de données data.txt
est stocké dans le répertoire /user/hadoop/input
de HDFS, qui stocke le contenu de quelques conversations entre des personnes. Utilisez la commande suivante pour afficher le contenu :
hdfs dfs -cat /user/hadoop/input/data.txt
Mapper personnalisé
Ensuite, nous allons créer une classe Mapper personnalisée appelée WordCountMapper
qui étend Mapper
. Ce Mapper traitera les données d'entrée et émettra des paires clé-valeur. Notons que les données traitées sont le contenu de chaque ligne de la conversation, pas les noms des personnes. Reportez-vous à l'exemple suivant pour compléter la méthode map
dans WordCountMapper.java
dans /home/hadoop/
.
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
// Convertir l'objet Text en une chaîne de caractères
String line = value.toString();
// Découper la chaîne en utilisant StringTokenizer
StringTokenizer tokenizer = new StringTokenizer(line);
// Parcourir chaque jeton et l'écrire dans le contexte
while (tokenizer.hasMoreTokens()) {
// Définir le mot actuel
word.set(tokenizer.nextToken().trim());
// Écrire le mot et son compte dans le contexte
context.write(word, one);
}
}
Ensuite, utilisez la commande suivante pour compiler le code en version java 8 :
javac -source 8 -target 8 -cp $HADOOP_HOME/share/hadoop/common/hadoop-common-3.3.6.jar:$HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-client-core-3.3.6.jar:. WordCountMapper.java
Reducer personnalisé
Enfin, nous allons créer une classe Reducer personnalisée appelée WordCountReducer
qui étend Reducer
. Ce Reducer aggregera les valeurs pour chaque clé et émettra le résultat final. Complétez la méthode reduce
dans WordCountReducer.java
dans /home/hadoop/
avec l'exemple suivant.
@Override
protected void reduce(Text key, Iterable<IntWritable> values, Context context)
throws IOException, InterruptedException {
// Initialiser une variable pour stocker la somme des comptes pour chaque mot
int sum = 0;
// Parcourir tous les comptes pour le mot actuel et calculer la somme totale
for (IntWritable value : values) {
sum += value.get();
}
// Définir le compte final pour le mot actuel
result.set(sum);
// Écrire le mot et son compte final dans le contexte
context.write(key, result);
}
Ensuite, utilisez la commande suivante pour compiler le code en version java 8 :
javac -source 8 -target 8 -cp $HADOOP_HOME/share/hadoop/common/hadoop-common-3.3.6.jar:$HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-client-core-3.3.6.jar:. WordCountReducer.java