Xaras Datenzauberei

HadoopHadoopBeginner
Jetzt üben

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

Einführung

Im magischen Wüstenreich Xara suchte der weise und gütige König Amir die Macht der umfangreichen Datenressourcen, die sich über sein Königreich verbreiteten, zu nutzen. Er rief seine geschicktesten Datenzauberer, um ein System zu entwickeln, das die Daten seines Königreichs sammeln, verarbeiten und analysieren konnte, um Erkenntnisse zu gewinnen, die zur Entscheidungsfindung und zum Wohlstand aller beitragen sollten.

Ziel war es, eine robuste und skalierbare Datenplattform zu schaffen, die sich mit dem Hadoop Distributed File System (HDFS) integrieren und die Macht von MapReduce für die effiziente Datenverarbeitung nutzen konnte. Diese Plattform würde es dem Königreich ermöglichen, Daten aus verschiedenen Quellen wie Handelsdaten, landwirtschaftliche Erträge und Volkszählungsinformationen zu analysieren, was König Amir in der Lage setzen würde, fundierte Entscheidungen zu treffen, um das Wohlergehen seiner Untertanen zu verbessern.

Die Erforschung der Hadoop-Ekosystem

In diesem Schritt werden Sie sich mit dem Hadoop-Ekosystem und seinen Kernkomponenten: HDFS und MapReduce vertraut machen.

Hadoop ist ein Open-Source-Framework für die verteilte Speicherung und Verarbeitung großer Datensätze über Clustern von Standard-Hardware. Es besteht aus zwei Hauptkomponenten:

  1. Hadoop Distributed File System (HDFS): Ein verteiltes Dateisystem, das dazu entwickelt wurde, große Dateien auf mehreren Computern zu speichern und dabei Fehlertoleranz und hohen Datenfluss bei der Datenzugang gewährleisten.

  2. MapReduce: Ein Programmiermodell und Softwareframework zum Schreiben von Anwendungen, die große Mengen an Daten parallel über einen Cluster von Computern verarbeiten.

Um das Hadoop-Ekosystem zu erkunden, können Sie die folgenden Befehle in Ihrem Terminal verwenden:

Zunächst stellen Sie sicher, dass Sie als Benutzer hadoop angemeldet sind, indem Sie folgenden Befehl im Terminal ausführen:

su - hadoop

Listen Sie die Verzeichnisse und Dateien in HDFS auf:

hdfs dfs -ls /

Erstellen Sie ein neues Verzeichnis in HDFS:

hdfs dfs -mkdir -p /home/hadoop/input

Kopieren Sie eine lokale Datei in HDFS:

hdfs dfs -put /home/hadoop/local/file.txt /home/hadoop/input

Diese Befehle zeigen, wie man mit HDFS interagiert, indem man dessen Inhalt auflistet, Verzeichnisse erstellt und Dateien aus dem lokalen Dateisystem kopiert.

Der Befehl hdfs dfs wird verwendet, um mit dem Hadoop Distributed File System (HDFS) zu interagieren. Die Option -ls listet den Inhalt eines Verzeichnisses in HDFS auf, während -mkdir ein neues Verzeichnis erstellt. Die Option -put kopiert eine lokale Datei in HDFS.

Ausführen eines MapReduce-Jobs

In diesem Schritt lernen Sie, wie Sie einen MapReduce-Job auf den in HDFS gespeicherten Daten ausführen, indem Sie die Macht der parallelen Verarbeitung nutzen, um große Datensätze effizient zu analysieren.

MapReduce ist ein Programmiermodell zur parallelen Verarbeitung großer Datensätze über einem Cluster von Computern. Es besteht aus zwei Hauptphasen:

  1. Map: Die Eingabedaten werden in kleinere Blöcke unterteilt, und jeder Block wird von einer separaten Aufgabe namens "Mapper" verarbeitet. Der Mapper verarbeitet die Daten und gibt Schlüssel-Wert-Paare aus.

  2. Reduce: Die Ausgabe der Mapper wird nach Schlüssel sortiert und gruppiert, und jede Gruppe wird von einer separaten Aufgabe namens "Reducer" verarbeitet. Der Reducer kombiniert die mit jedem Schlüssel assoziierten Werte und erzeugt das endgültige Ergebnis.

Lassen Sie uns einen einfachen MapReduce-Job ausführen, der die Vorkommen von Wörtern in einer Textdatei zählt. Erstellen Sie zunächst eine Java-Datei namens WordCount.java mit dem folgenden Inhalt:

import java.io.IOException;
import java.util.StringTokenizer;

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.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

public class WordCount {

    public static class TokenizerMapper
            extends Mapper<Object, Text, Text, IntWritable>{

        private final static IntWritable one = new IntWritable(1);
        private Text word = new Text();

        public void map(Object key, Text value, Context context
        ) throws IOException, InterruptedException {
            StringTokenizer itr = new StringTokenizer(value.toString());
            while (itr.hasMoreTokens()) {
                word.set(itr.nextToken());
                context.write(word, one);
            }
        }
    }

    public static class IntSumReducer
            extends Reducer<Text,IntWritable,Text,IntWritable> {
        private IntWritable result = new IntWritable();

        public void reduce(Text key, Iterable<IntWritable> values,
                           Context context
        ) throws IOException, InterruptedException {
            int sum = 0;
            for (IntWritable val : values) {
                sum += val.get();
            }
            result.set(sum);
            context.write(key, result);
        }
    }

    public static void main(String[] args) throws Exception {
        Configuration conf = new Configuration();
        Job job = Job.getInstance(conf, "word count");
        job.setJarByClass(WordCount.class);
        job.setMapperClass(TokenizerMapper.class);
        job.setCombinerClass(IntSumReducer.class);
        job.setReducerClass(IntSumReducer.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);
    }
}

Als nächstes kompilieren Sie die Java-Datei:

mkdir ~/wordcount
javac -source 8 -target 8 -classpath $(hadoop classpath) -d ~/wordcount WordCount.java
jar -cvf ~/wordcount.jar -C ~/wordcount.

Schließlich führen Sie den MapReduce-Job aus:

hadoop jar ~/wordcount.jar WordCount /home/hadoop/input/file.txt /home/hadoop/output

Die Klasse WordCount definiert einen MapReduce-Job, der die Vorkommen von Wörtern in einer Textdatei zählt. Die Klasse TokenizerMapper tokenisiert jede Zeile des Eingabetexts und gibt (Wort, 1)-Schlüssel-Wert-Paare aus. Die Klasse IntSumReducer summiert die Werte (Zählungen) für jedes Wort auf und gibt die endgültigen (Wort, Zählung)-Paare aus.

Die Java-Datei wird kompiliert und in eine JAR-Datei verpackt, die dann mit dem Befehl hadoop jar ausgeführt wird. Der Pfad zur Eingabedatei (/home/hadoop/input/file.txt) und der Pfad zum Ausgabeverzeichnis (/home/hadoop/output) werden als Argumente angegeben.

Zusammenfassung

In diesem Lab haben Sie eine Reise in das magische Wüstenreich Xara unternommen, wo Sie König Amir dabei unterstützt haben, die Macht des Hadoop-Ekosystems zur Verarbeitung und Analyse der Daten seines Königreichs zu nutzen. Sie haben die Kernkomponenten von Hadoop erkundet, einschließlich HDFS für die verteilte Speicherung und MapReduce für die parallele Datenverarbeitung.

Durch praktische Schritte haben Sie gelernt, wie Sie mit HDFS interagieren, Verzeichnisse erstellen und Dateien hochladen. Sie haben auch Erfahrung bei der Ausführung eines MapReduce-Jobs gemacht, insbesondere einer Wortzählungsanwendung, die die parallelen Verarbeitungsfähigkeiten von Hadoop demonstriert hat.

Durch die Fertigstellung dieses Labs haben Sie wertvolle Kenntnisse in der Integration von Hadoop mit HDFS und MapReduce erworben, was Sie mit den Fähigkeiten ausstattet, reale Big-Data-Herausforderungen anzugehen. Diese Erfahrung wird zweifellos zum Wachstum als Datenzauberer beitragen und Sie in der Lage versetzen, in verschiedenen Bereichen Erkenntnisse zu gewinnen und Entscheidungen zu treffen.