Implementierung des Mappers und Reducers
In diesem Schritt werden wir eine Mapper- und eine Reducer-Klasse erstellen, um die Buchdaten mit dem MapReduce-Paradigma zu verarbeiten.
Benutzerdefinierter BookMapper
Zunächst erstellen Sie eine neue Java-Datei mit dem Namen BookMapper.java
im Verzeichnis /home/hadoop
mit dem folgenden Inhalt:
import java.io.IOException;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
// BookMapper erweitert die Mapper-Klasse, um textuelle Eingabedateien zu verarbeiten
// Eingabeschlüssel-Wert-Paare sind LongWritable (Zeilennummer) und Text (Zeileninhalt)
// Ausgabeschlüssel-Wert-Paare sind Text (Autorennamen) und Book (Buchdetails)
public class BookMapper extends Mapper<LongWritable, Text, Text, Book> {
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
// Teilen Sie die Eingabezeile durch Komma auf
String[] bookData = value.toString().split(",");
// Extrahieren Sie Titel, Autor und Jahr aus der Eingabezeile
String title = bookData[0];
String author = bookData[1];
int year = Integer.parseInt(bookData[2]);
// Schreiben Sie den Autor und die Buchdetails in den Kontext
context.write(new Text(author), new Book(title, author, year));
}
}
Diese BookMapper
-Klasse nimmt eine Zeile Eingabedaten im Format "title,author,year"
entgegen und emittiert ein Schlüssel-Wert-Paar mit dem Autor als Schlüssel und einem Book
-Objekt als Wert.
Benutzerdefinierter BookReducer
Als nächstes erstellen Sie eine neue Java-Datei mit dem Namen BookReducer.java
im Verzeichnis /home/hadoop
mit dem folgenden Inhalt:
import java.io.IOException;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
// BookReducer erweitert die Reducer-Klasse, um Buchdetails nach Autor zu aggregieren
// Eingabeschlüssel-Wert-Paare sind Text (Autorennamen) und Book (Buchdetails)
// Ausgabeschlüssel-Wert-Paare sind Text (Autorennamen) und Book (aggregierte Buchdetails)
public class BookReducer extends Reducer<Text, Book, Text, Book> {
@Override
protected void reduce(Text key, Iterable<Book> values, Context context) throws IOException, InterruptedException {
// Iterieren Sie durch die Bücher für denselben Autor und schreiben Sie jedes Buch in den Kontext
for (Book book : values) {
context.write(key, book);
}
}
}
Diese BookReducer
-Klasse emittiert einfach die Eingabeschlüssel-Wert-Paare unverändert, was effektiv die Bücher nach Autor gruppiert.
Kompilieren der Dateien
Schließlich müssen Sie die Java-Klassen mit den folgenden Befehlen kompilieren:
## Kompilieren Sie die Java-Klassen
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