Einführung
Stellen Sie sich ein Szenario vor, in dem Sie ein talentierter Ingenieur sind, der für die Datenverwaltung in einem Weltraumschlacht-Simulationssystem verantwortlich ist. Ihr Ziel ist es, die Leistung des Systems zu optimieren, indem Sie die Hadoop Shuffle Combiner-Technik im MapReduce-Prozess implementieren. Mit der Nutzung des Combiners möchten Sie das Netzwerkverkehr reduzieren und die Gesamtleistung bei der Datenverarbeitung während der Simulation verbessern.
Mapper schreiben
In diesem Schritt werden Sie die Mapper-Klasse schreiben, um die Eingabedaten zu verarbeiten und Zwischenschlüssel-Wert-Paare auszugeben.
Öffnen Sie das Terminal und folgen Sie den untenstehenden Schritten, um loszulegen.
Wechseln Sie zum Benutzer hadoop und wechseln Sie dann in das Home-Verzeichnis des Benutzers hadoop:
su - hadoop
Erstellen Sie eine Java-Datei für die Mapper-Klasse:
nano /home/hadoop/SpaceBattleMapper.java
Fügen Sie dann den folgenden Code in die Datei SpaceBattleMapper.java ein:
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Mapper.Context;
import java.io.IOException;
public class SpaceBattleMapper extends Mapper<LongWritable, Text, Text, IntWritable> {
private final static IntWritable one = new IntWritable(1);
private Text word = new Text();
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
// Teilen Sie die Eingabezeile in Wörter auf
String[] words = value.toString().split("\\s+");
// Geben Sie für jedes Wort ein Schlüssel-Wert-Paar aus
for (String w : words) {
word.set(w);
context.write(word, one);
}
}
}
Tipps: Sie können den Code aus der Eingabemaske rechts kopieren und ihn mit Strg + Umschalt + V in den geöffneten nano-Editor einfügen. Drücken Sie Strg + O, um die Datei zu speichern, und Enter, um zu bestätigen, wenn der nano-Editor Sie dazu auffordert. Schließen Sie den Editor schließlich mit Strg + X.
Die Klasse SpaceBattleMapper erweitert die Klasse Mapper des Hadoop-Frameworks. Sie wird verwendet, um Eingabedaten im Format Schlüssel-Wert-Paar zu verarbeiten, wobei der Schlüssel ein LongWritable ist, das den Byteoffset der Zeile in der Eingabedatei darstellt, und der Wert ein Text-Objekt, das die Textzeile darstellt.
Die Klasse definiert zwei private Felder:
one: EinIntWritable-Objekt mit einem konstanten Wert von 1. Dies wird als Wert in den ausgegebenen Schlüssel-Wert-Paaren verwendet.word: EinText-Objekt, das verwendet wird, um jedes Wort aus der Eingabezeile zu speichern.
Die map-Methode wird überschrieben, um die spezifische Zuordnungslogik bereitzustellen:
- Der Eingabe-
Text-Wert wird in einen String umgewandelt und in Wörter aufgeteilt, basierend auf Leerzeichen. - Für jedes Wort im Array wird das
word-Objekt auf das Wort gesetzt, und ein Schlüssel-Wert-Paar wird mit dem Wort als Schlüssel undoneals Wert ausgegeben. Dies wird mit dercontext.write-Methode durchgeführt.
Diese Mapper-Klasse ist so konzipiert, dass für jedes Wort in den Eingabedaten ein Schlüssel-Wert-Paar ausgegeben wird, mit dem Wort als Schlüssel und der ganzen Zahl 1 als Wert. Diese Einrichtung wird häufig in Wörterzählungsanwendungen verwendet, bei denen das Ziel darin besteht, die Vorkommen jedes Worts in einem Datensatz zu zählen.
Combiner implementieren
In diesem Schritt implementieren Sie die Combiner-Klasse, um eine lokale Aggregation vor dem Daten-Shuffling durchzuführen.
Erstellen Sie eine Java-Datei für die Combiner-Klasse:
nano /home/hadoop/SpaceBattleCombiner.java
Fügen Sie dann den folgenden Code in die Datei SpaceBattleCombiner.java ein:
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
import java.io.IOException;
public class SpaceBattleCombiner extends Reducer<Text, IntWritable, Text, IntWritable> {
@Override
protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
int sum = 0;
// Summieren Sie die Werte für jeden Schlüssel auf
for (IntWritable val : values) {
sum += val.get();
}
// Geben Sie den Schlüssel und die Summe seiner Werte aus
context.write(key, new IntWritable(sum));
}
}
Die Klasse SpaceBattleCombiner erweitert die Klasse Reducer des Hadoop-Frameworks. Sie wird als Combiner im MapReduce-Prozess verwendet, um eine lokale Aggregation von Zwischenschlüssel-Wert-Paaren durchzuführen, die vom Mapper emittiert werden.
Die Klasse überschreibt die reduce-Methode, um die spezifische Combiner-Logik bereitzustellen:
- Die Methode nimmt einen Schlüssel vom Typ
Textund ein Iterable von Werten vom TypIntWritableals Eingabe entgegen. Der Schlüssel repräsentiert ein Wort, und das Iterable enthält die Vorkommenszahlen dieses Worts. - Die Methode iteriert über die Werte, summiert sie auf, um die Gesamtzahl für das Wort zu erhalten.
- Schließlich gibt die Methode ein Schlüssel-Wert-Paar mit dem Wort als Schlüssel und der Gesamtzahl als Wert mit der
context.write-Methode aus.
Zweck der SpaceBattleCombiner ist es, eine lokale Aggregation der Zählungen für jedes Wort durchzuführen, bevor die Daten über das Netzwerk an den Reducer geschuffled werden. Dies reduziert die Menge an übertragenen Daten zwischen den Mapper- und Reducer-Phasen und verbessert die Effizienz des MapReduce-Jobs.
Reducer implementieren
In diesem Schritt implementieren Sie die Reducer-Klasse, um die endgültige Aggregation der Schlüssel-Wert-Paare durchzuführen.
- Erstellen Sie eine Java-Datei für die Reducer-Klasse:
nano /home/hadoop/SpaceBattleReducer.java
Fügen Sie dann den folgenden Code in die Datei SpaceBattleReducer.java ein:
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
import java.io.IOException;
public class SpaceBattleReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
@Override
protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
int sum = 0;
for (IntWritable val : values) {
sum += val.get();
}
context.write(key, new IntWritable(sum));
}
}
Die Klasse SpaceBattleReducer erweitert die Klasse Reducer des Hadoop-Frameworks. Sie wird verwendet, um die endgültige Aggregation der Zwischenschlüssel-Wert-Paare durchzuführen, die vom Mapper emittiert und optional von der Combiner verarbeitet werden.
Die Klasse überschreibt die reduce-Methode, um die spezifische Reducer-Logik bereitzustellen:
- Die Methode nimmt einen Schlüssel vom Typ
Textund ein Iterable von Werten vom TypIntWritableals Eingabe entgegen. Der Schlüssel repräsentiert ein Wort, und das Iterable enthält die Vorkommenszahlen dieses Worts. - Die Methode iteriert über die Werte, summiert sie auf, um die Gesamtzahl für das Wort zu erhalten.
- Schließlich gibt die Methode ein Schlüssel-Wert-Paar mit dem Wort als Schlüssel und der Gesamtzahl als Wert mit der
context.write-Methode aus.
Der SpaceBattleReducer führt die endgültige Aggregation der Daten durch, indem er die Zählungen für jedes Wort über alle Mapper-Ausgaben summiert. Dies liefert die endgültige Vorkommenszahl für jedes Wort in den Eingabedaten.
Driver schreiben
In diesem Schritt werden Sie eine Java-Datei erstellen, um den MapReduce-Job zu verwalten, einschließlich der Einrichtung der Job-Konfiguration und der Angabe der Mapper-, Combiner- und Reducer-Klassen.
Erstellen Sie eine Java-Datei für die Driver-Klasse:
nano /home/hadoop/SpaceBattleDriver.java
Fügen Sie dann den folgenden Code in die Datei SpaceBattleDriver.java ein:
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
public class SpaceBattleDriver {
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
Job job = Job.getInstance(conf, "Space Battle Simulation");
job.setJarByClass(SpaceBattleDriver.class);
job.setMapperClass(SpaceBattleMapper.class);
job.setCombinerClass(SpaceBattleCombiner.class);
job.setReducerClass(SpaceBattleReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
System.exit(job.waitForCompletion(true)? 0 : 1);
}
}
Die Klasse SpaceBattleDriver ist für die Konfiguration und Ausführung des MapReduce-Jobs für die Weltraumschlacht-Simulation verantwortlich.
Die Klasse beginnt mit der Erstellung eines neuen
Configuration-Objekts und einerJob-Instanz mit dieser Konfiguration. Dem Job wird ein Name, "Space Battle Simulation", zugewiesen, um ihn zu identifizieren.Die
setJarByClass-Methode wird mit derSpaceBattleDriver-Klasse aufgerufen, um die Jar-Datei festzulegen, die die für den Job erforderlichen Klassen enthält.Die
setMapperClass-,setCombinerClass- undsetReducerClass-Methoden werden verwendet, um die Klassen anzugeben, die die Zuordnung-, Zusammenfassungs- und Reduktionstasks ausführen werden.Die
setOutputKeyClass- undsetOutputValueClass-Methoden definieren die Typen der Ausgabeschlüssel und -werte, die in diesem FallTextundIntWritablesind.Die
FileInputFormat.addInputPath- undFileOutputFormat.setOutputPath-Methoden legen die Pfade für die Eingabe- und Ausgabedaten fest. Diese Pfade werden als Befehlszeilenargumente an diemain-Methode übergeben.Schließlich wird die
job.waitForCompletion-Methode aufgerufen, um den Job zu übermitteln und auf seine Fertigstellung zu warten. Die Methode gibttruezurück, wenn der Job erfolgreich abgeschlossen ist, undfalseandernfalls. Das Programm beendet sich mit einem Statuscode von 0, wenn der Job erfolgreich ist, und 1, wenn er es nicht ist.
Diese Driver-Klasse bindet alle Komponenten des MapReduce-Jobs zusammen und ist der Einstiegspunkt für die Ausführung des Jobs.
Zusammenfassung
In diesem Lab haben Sie die Implementierung der Hadoop Shuffle Combiner-Technik in einem Weltraumschlacht-Simulations-Szenario durchlaufen. Indem Sie den Schritten zum Erstellen von Mapper-, Combiner-, Reducer- und Driver-Klassen folgen, haben Sie praktische Erfahrungen bei der Optimierung der Datenverarbeitung in einer Hadoop MapReduce-Umgebung gewonnen. Ziel dieses Labs war es, Ihr Verständnis für die Verringerung des Netzwerkaufwands und die Verbesserung der Recheneffizienz bei Big-Data-Verarbeitungstasks zu erweitern.



