Dinosaurierdatenfusion mit Hadoop

HadoopHadoopBeginner
Jetzt üben

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

Einführung

Im Zeitalter der Dinosaurier beginnt ein mutiger Dinosaurierjäger namens Alex eine spannende Mission, um die Geheimnisse dieser prähistorischen Kreaturen zu enthüllen. Alex' Ziel ist es, wertvolle Daten aus verschiedenen Quellen zu sammeln und fortgeschrittene Analysen durchzuführen, um Einblicke in das Verhalten, die Ernährung und die Evolution verschiedener Dinosaurierspezies zu gewinnen.

Um dies zu erreichen, muss Alex die Macht von Hadoop MapReduce und seine Fähigkeit zur effizienten Durchführung von Join-Operationen nutzen. Indem er Daten aus mehreren Quellen verbindet, kann Alex Informationen über Dinosaurierfossilien, ihre geologischen Orte und die Umweltbedingungen kombinieren, um ein umfassendes Bild der Dinosaurierwelt zu zeichnen.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL hadoop(("Hadoop")) -.-> hadoop/HadoopMapReduceGroup(["Hadoop MapReduce"]) hadoop(("Hadoop")) -.-> hadoop/HadoopHDFSGroup(["Hadoop HDFS"]) hadoop(("Hadoop")) -.-> hadoop/HadoopHiveGroup(["Hadoop Hive"]) hadoop/HadoopHDFSGroup -.-> hadoop/hdfs_setup("HDFS Setup") hadoop/HadoopHDFSGroup -.-> hadoop/fs_cat("FS Shell cat") hadoop/HadoopHDFSGroup -.-> hadoop/fs_ls("FS Shell ls") hadoop/HadoopHDFSGroup -.-> hadoop/fs_mkdir("FS Shell mkdir") hadoop/HadoopHDFSGroup -.-> hadoop/fs_put("FS Shell copyToLocal/put") hadoop/HadoopMapReduceGroup -.-> hadoop/mappers_reducers("Coding Mappers and Reducers") hadoop/HadoopMapReduceGroup -.-> hadoop/implement_join("Implementing Join Operation") hadoop/HadoopHiveGroup -.-> hadoop/import_export_data("Importing and Exporting Data") hadoop/HadoopHiveGroup -.-> hadoop/join("join Usage") subgraph Lab Skills hadoop/hdfs_setup -.-> lab-288979{{"Dinosaurierdatenfusion mit Hadoop"}} hadoop/fs_cat -.-> lab-288979{{"Dinosaurierdatenfusion mit Hadoop"}} hadoop/fs_ls -.-> lab-288979{{"Dinosaurierdatenfusion mit Hadoop"}} hadoop/fs_mkdir -.-> lab-288979{{"Dinosaurierdatenfusion mit Hadoop"}} hadoop/fs_put -.-> lab-288979{{"Dinosaurierdatenfusion mit Hadoop"}} hadoop/mappers_reducers -.-> lab-288979{{"Dinosaurierdatenfusion mit Hadoop"}} hadoop/implement_join -.-> lab-288979{{"Dinosaurierdatenfusion mit Hadoop"}} hadoop/import_export_data -.-> lab-288979{{"Dinosaurierdatenfusion mit Hadoop"}} hadoop/join -.-> lab-288979{{"Dinosaurierdatenfusion mit Hadoop"}} end

Einrichten der Umgebung und der Daten

In diesem Schritt werden wir die erforderliche Umgebung einrichten und die Daten für die Join-Operation vorbereiten.

Ändern Sie zunächst den Benutzer in hadoop und wechseln Sie dann in das Home-Verzeichnis des hadoop-Benutzers:

su - hadoop

Erstellen Sie ein neues Verzeichnis namens join-lab, um unsere Dateien zu speichern:

mkdir join-lab
cd join-lab

Als Nächstes erstellen wir zwei Datendateien: dinosaurs.txt und locations.txt. Diese Dateien werden jeweils Informationen über Dinosaurier und ihre Fossilorte enthalten.

Erstellen Sie dinosaurs.txt mit dem folgenden Inhalt:

trex,Tyrannosaurus Rex,carnivore
velociraptor,Velociraptor,carnivore
brachiosaurus,Brachiosaurus,herbivore
stegosaurus,Stegosaurus,herbivore

Erstellen Sie locations.txt mit dem folgenden Inhalt:

trex,North America
velociraptor,Asia
brachiosaurus,Africa
stegosaurus,North America

Schließlich laden Sie join-lab in hdfs hoch, indem Sie den folgenden Befehl verwenden:

hadoop fs -mkdir -p /home/hadoop
hadoop fs -put /home/hadoop/join-lab /home/hadoop/

Implementieren der Join-Operation

In diesem Schritt werden wir einen MapReduce-Job implementieren, um eine Join-Operation auf den Dateien dinosaurs.txt und locations.txt durchzuführen.

Erstellen Sie in das Verzeichnis /home/hadoop/join-lab eine neue Java-Datei namens JoinDinosaurs.java mit dem folgenden Inhalt:

import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

public class JoinDinosaurs {

    public static class JoinMapper extends Mapper<LongWritable, Text, Text, Text> {
        private final Text outKey = new Text();
        private final Text outValue = new Text();

        @Override
        protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
            String line = value.toString();
            String[] parts = line.split(",");

            if (parts.length == 2) { // locations.txt
                outKey.set(parts[0]);
                outValue.set("LOC:" + parts[1]);
            } else if (parts.length == 3) { // dinosaurs.txt
                outKey.set(parts[0]);
                outValue.set("DIN:" + parts[1] + "," + parts[2]);
            }

            context.write(outKey, outValue);
        }
    }

    public static class JoinReducer extends Reducer<Text, Text, Text, Text> {
        private final Text outValue = new Text();

        @Override
        protected void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {
            Map<String, String> dinMap = new HashMap<>();
            StringBuilder locBuilder = new StringBuilder();

            for (Text value : values) {
                String valStr = value.toString();
                if (valStr.startsWith("DIN:")) {
                    dinMap.put("DIN", valStr.substring(4));
                } else if (valStr.startsWith("LOC:")) {
                    locBuilder.append(valStr.substring(4)).append(",");
                }

                if (locBuilder.length() > 0) {
                    locBuilder.deleteCharAt(locBuilder.length() - 1);
                }
            }

            StringBuilder outBuilder = new StringBuilder();
            for (Map.Entry<String, String> entry : dinMap.entrySet()) {
                outBuilder.append(entry.getValue()).append("\t").append(locBuilder.toString().trim());
            }

            outValue.set(outBuilder.toString());
            context.write(key, outValue);
        }
    }

    public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
        if (args.length!= 2) {
            System.err.println("Usage: JoinDinosaurs <input_dir> <output_dir>");
            System.exit(1);
        }

        Job job = Job.getInstance();
        job.setJarByClass(JoinDinosaurs.class);
        job.setJobName("Join Dinosaurs");

        FileInputFormat.addInputPath(job, new Path(args[0]));
        FileOutputFormat.setOutputPath(job, new Path(args[1]));

        job.setMapperClass(JoinMapper.class);
        job.setReducerClass(JoinReducer.class);

        job.setInputFormatClass(TextInputFormat.class);
        job.setOutputFormatClass(TextOutputFormat.class);

        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(Text.class);

        System.exit(job.waitForCompletion(true)? 0 : 1);
    }
}

Dieser Code definiert einen MapReduce-Job mit einem benutzerdefinierten JoinMapper und JoinReducer. Der Mapper liest die Eingabedaten aus dinosaurs.txt und locations.txt und emittiert Schlüssel-Wert-Paare mit dem Namen des Dinosauriers als Schlüssel und dem Datentyp ("DIN" oder "LOC") zusammen mit dem entsprechenden Wert. Der Reducer führt dann die Join-Operation durch, indem er die Werte nach Schlüssel gruppiert und die Dinosaurierinformationen mit dem Standort kombiniert.

Um den Code zu kompilieren, führen Sie folgenden Befehl aus:

mkdir classes
javac -source 8 -target 8 -cp "/home/hadoop/hadoop/share/hadoop/common/hadoop-common-3.3.6.jar:/home/hadoop/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-client-core-3.3.6.jar:/home/hadoop/hadoop/share/hadoop/common/lib/*" -d classes JoinDinosaurs.java
jar -cvf join-dinosaurs.jar -C classes/.

Als Nächstes führen Sie den MapReduce-Job mit dem folgenden Befehl aus:

hadoop jar join-dinosaurs.jar JoinDinosaurs /home/hadoop/join-lab /home/hadoop/join-lab/output

Dieser Befehl führt die Klasse JoinDinosaurs aus der Datei join-dinosaurs.jar aus, mit dem Eingabeverzeichnis /home/hadoop/join-lab (enthaltend dinosaurs.txt und locations.txt) und dem Ausgabeverzeichnis /home/hadoop/join-lab/output.

Nachdem der Job erfolgreich abgeschlossen ist, können Sie die Ausgabe im Verzeichnis /home/hadoop/join-lab/output ansehen.

Analysieren der Ausgabe

In diesem Schritt werden wir die Ausgabe der Join-Operation analysieren, um Einblicke in die Welt der Dinosaurier zu gewinnen.

Zunächst überprüfen wir den Inhalt des Ausgabeverzeichnisses:

hadoop fs -ls /home/hadoop/join-lab/output
hadoop fs -cat /home/hadoop/join-lab/output/part-r-00000

Sie sollten eine Ausgabe ähnlich der folgenden sehen:

brachiosaurus    Brachiosaurus,herbivore    Africa
stegosaurus      Stegosaurus,herbivore      North America
trex     Tyrannosaurus Rex,carnivore        North America
velociraptor     Velociraptor,carnivore     Asia

Diese Ausgabe zeigt die verknüpften Daten, wobei jede Zeile den Namen des Dinosauriers, seine Details (Art und Ernährung) und den Ort enthält, an dem seine Fossilien gefunden wurden.

Anhand der Ausgabe können wir die folgenden Beobachtungen machen:

  • Der Tyrannosaurus Rex (T-Rex) und der Velociraptor waren fleischfressende Dinosaurier, während der Brachiosaurus und der Stegosaurus Pflanzenfresser waren.
  • Die Fossilien des Brachiosaurus wurden in Afrika gefunden, die Fossilien des Stegosaurus und des Tyrannosaurus Rex in Nordamerika und die Fossilien des Velociraptor in Asien.

Diese Erkenntnisse können Paläontologen dabei helfen, die Verbreitung,性行为 und Evolution verschiedener Dinosaurierspezies in verschiedenen geologischen Regionen besser zu verstehen.

Zusammenfassung

In diesem Lab haben wir die Implementierung einer Join-Operation mit Hadoop MapReduce untersucht. Indem wir Daten aus mehreren Quellen kombinierten, konnten wir wertvolle Einblicke in die Welt der Dinosaurier gewinnen, einschließlich ihrer Arten, Ernährungen und Fossilorte.

Das Lab hat das Konzept des Joins von Daten mit MapReduce eingeführt, wobei der Mapper die Daten für die Join-Operation vorbereitet und der Reducer die tatsächliche Join-Operation durchführt, indem er die Werte nach Schlüssel gruppiert und die Informationen kombiniert.

Durch die praktische Erfahrung beim Einrichten der Umgebung, Vorbereiten der Daten, Implementieren des MapReduce-Jobs und Analysieren der Ausgabe haben wir praktisches Wissen darüber gewonnen, wie wir die leistungsfähigen Datenverarbeitungsfähigkeiten von Hadoop nutzen, um komplexe analytische Probleme zu lösen.

Dieses Lab hat nicht nur unser Verständnis von Join-Operationen verstärkt, sondern auch unsere Fähigkeiten bei der Arbeit mit Hadoop MapReduce, dem Schreiben von Java-Code und der Ausführung von Befehlen in einer Linux-Umgebung verbessert. Die Erfahrung, eine vollständige Lösung von Grund auf zu entwerfen und umzusetzen, war unschätzbar und wird zweifellos zum Wachstum als Data Engineer oder Data Scientist beitragen.