Schreiben des Mappers und Reducers
In diesem Schritt tauchen wir in das Herz von Hadoop MapReduce ein und erstellen unsere eigenen Mapper- und Reducer-Klassen.
Untersuchen der Datendatei
Verwende zunächst den Befehl su - hadoop
, um die Identität zu wechseln. Die Datendatei data.txt
ist im Verzeichnis /user/hadoop/input
des HDFS gespeichert, das die Inhalte von Gesprächen einiger Personen enthält. Verwende den folgenden Befehl, um die Inhalte anzuzeigen:
hdfs dfs -cat /user/hadoop/input/data.txt
Anpassender Mapper
Als nächstes erstellen wir eine benutzerdefinierte Mapper-Klasse namens WordCountMapper
, die von Mapper
erbt. Dieser Mapper verarbeitet die Eingabedaten und emittiert Schlüssel-Wert-Paare. Beachten Sie, dass die verarbeiteten Daten der Inhalt jeder Zeile des Gesprächs sind, nicht die Namen der Personen. Verweisen Sie auf das folgende Beispiel, um die map
-Methode in WordCountMapper.java
unter /home/hadoop/
zu ergänzen.
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
// Konvertiere das Text-Objekt in einen String
String line = value.toString();
// Tokenisiere den String mit StringTokenizer
StringTokenizer tokenizer = new StringTokenizer(line);
// Iteriere über jedes Token und schreibe es in den Kontext
while (tokenizer.hasMoreTokens()) {
// Setze das aktuelle Wort
word.set(tokenizer.nextToken().trim());
// Schreibe das Wort und seine Anzahl in den Kontext
context.write(word, one);
}
}
Verwende dann den folgenden Befehl, um den Code in der Java 8-Version zu kompilieren:
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
Anpassender Reducer
Schließlich erstellen wir eine benutzerdefinierte Reducer-Klasse namens WordCountReducer
, die von Reducer
erbt. Dieser Reducer aggregiert die Werte für jeden Schlüssel und emittiert das endgültige Ergebnis. Ergänzen Sie die reduce
-Methode in WordCountReducer.java
unter /home/hadoop/
mit dem folgenden Beispiel.
@Override
protected void reduce(Text key, Iterable<IntWritable> values, Context context)
throws IOException, InterruptedException {
// Initialisiere eine Variable, um die Summe der Zählungen für jedes Wort zu speichern
int sum = 0;
// Iteriere über alle Zählungen für das aktuelle Wort und berechne die Gesamtzahl
for (IntWritable value : values) {
sum += value.get();
}
// Setze die endgültige Anzahl für das aktuelle Wort
result.set(sum);
// Schreibe das Wort und seine endgültige Anzahl in den Kontext
context.write(key, result);
}
Verwende dann den folgenden Befehl, um den Code in der Java 8-Version zu kompilieren:
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