Implémentation du Mapper et du Reducer
Dans cette étape, nous allons créer une classe Mapper et une classe Reducer pour traiter les données des livres en utilisant le paradigme MapReduce.
BookMapper personnalisé
Tout d'abord, créez un nouveau fichier Java nommé BookMapper.java
dans le répertoire /home/hadoop
avec le contenu suivant :
import java.io.IOException;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
// BookMapper étend la classe Mapper pour traiter les fichiers d'entrée texte
// Les paires clé-valeur d'entrée sont LongWritable (numéro de ligne) et Text (contenu de ligne)
// Les paires clé-valeur de sortie sont Text (nom de l'auteur) et Book (détails du livre)
public class BookMapper extends Mapper<LongWritable, Text, Text, Book> {
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
// Divisez la ligne d'entrée par virgule
String[] bookData = value.toString().split(",");
// Extrait le titre, l'auteur et l'année de la ligne d'entrée
String title = bookData[0];
String author = bookData[1];
int year = Integer.parseInt(bookData[2]);
// Écrivez l'auteur et les détails du livre dans le contexte
context.write(new Text(author), new Book(title, author, year));
}
}
Cette classe BookMapper
prend une ligne de données d'entrée au format "titre,auteur,année"
et émet une paire clé-valeur avec l'auteur comme clé et un objet Book
comme valeur.
BookReducer personnalisé
Ensuite, créez un nouveau fichier Java nommé BookReducer.java
dans le répertoire /home/hadoop
avec le contenu suivant :
import java.io.IOException;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
// BookReducer étend la classe Reducer pour regrouper les détails des livres par auteur
// Les paires clé-valeur d'entrée sont Text (nom de l'auteur) et Book (détails du livre)
// Les paires clé-valeur de sortie sont Text (nom de l'auteur) et Book (détails des livres regroupés)
public class BookReducer extends Reducer<Text, Book, Text, Book> {
@Override
protected void reduce(Text key, Iterable<Book> values, Context context) throws IOException, InterruptedException {
// Parcourez les livres pour le même auteur et écrivez chaque livre dans le contexte
for (Book book : values) {
context.write(key, book);
}
}
}
Cette classe BookReducer
émet simplement les paires clé-valeur d'entrée telles quelles, regroupant ainsi les livres par auteur.
Compiler les fichiers
Finalement, vous devrez compiler les classes Java en utilisant les commandes suivantes :
## Compile les classes Java
javac -source 8 -target 8 -classpath $HADOOP_HOME/share/hadoop/common/hadoop-common-3.3.6.jar:$HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-client-core-3.3.6.jar:. BookMapper.java BookReducer.java