Hadoop Shuffle Combiner

HadoopHadoopBeginner
Jetzt üben

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

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.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL hadoop(("Hadoop")) -.-> hadoop/HadoopMapReduceGroup(["Hadoop MapReduce"]) hadoop(("Hadoop")) -.-> hadoop/HadoopYARNGroup(["Hadoop YARN"]) hadoop(("Hadoop")) -.-> hadoop/HadoopHiveGroup(["Hadoop Hive"]) hadoop/HadoopMapReduceGroup -.-> hadoop/setup_jobs("Setting up MapReduce Jobs") hadoop/HadoopMapReduceGroup -.-> hadoop/mappers_reducers("Coding Mappers and Reducers") hadoop/HadoopMapReduceGroup -.-> hadoop/shuffle_combiner("Shuffle Combiner") hadoop/HadoopYARNGroup -.-> hadoop/yarn_jar("Yarn Commands jar") hadoop/HadoopHiveGroup -.-> hadoop/process("Process Control Function") hadoop/HadoopHiveGroup -.-> hadoop/aggregating("Aggregating Function") hadoop/HadoopHiveGroup -.-> hadoop/udf("User Defined Function") subgraph Lab Skills hadoop/setup_jobs -.-> lab-271904{{"Hadoop Shuffle Combiner"}} hadoop/mappers_reducers -.-> lab-271904{{"Hadoop Shuffle Combiner"}} hadoop/shuffle_combiner -.-> lab-271904{{"Hadoop Shuffle Combiner"}} hadoop/yarn_jar -.-> lab-271904{{"Hadoop Shuffle Combiner"}} hadoop/process -.-> lab-271904{{"Hadoop Shuffle Combiner"}} hadoop/aggregating -.-> lab-271904{{"Hadoop Shuffle Combiner"}} hadoop/udf -.-> lab-271904{{"Hadoop Shuffle Combiner"}} end

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: Ein IntWritable-Objekt mit einem konstanten Wert von 1. Dies wird als Wert in den ausgegebenen Schlüssel-Wert-Paaren verwendet.
  • word: Ein Text-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 und one als Wert ausgegeben. Dies wird mit der context.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 Text und ein Iterable von Werten vom Typ IntWritable als 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.

  1. 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 Text und ein Iterable von Werten vom Typ IntWritable als 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 einer Job-Instanz mit dieser Konfiguration. Dem Job wird ein Name, "Space Battle Simulation", zugewiesen, um ihn zu identifizieren.

  • Die setJarByClass-Methode wird mit der SpaceBattleDriver-Klasse aufgerufen, um die Jar-Datei festzulegen, die die für den Job erforderlichen Klassen enthält.

  • Die setMapperClass-, setCombinerClass- und setReducerClass-Methoden werden verwendet, um die Klassen anzugeben, die die Zuordnung-, Zusammenfassungs- und Reduktionstasks ausführen werden.

  • Die setOutputKeyClass- und setOutputValueClass-Methoden definieren die Typen der Ausgabeschlüssel und -werte, die in diesem Fall Text und IntWritable sind.

  • Die FileInputFormat.addInputPath- und FileOutputFormat.setOutputPath-Methoden legen die Pfade für die Eingabe- und Ausgabedaten fest. Diese Pfade werden als Befehlszeilenargumente an die main-Methode übergeben.

  • Schließlich wird die job.waitForCompletion-Methode aufgerufen, um den Job zu übermitteln und auf seine Fertigstellung zu warten. Die Methode gibt true zurück, wenn der Job erfolgreich abgeschlossen ist, und false andernfalls. 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.