Antike Weisheit des verteilten Caches

HadoopHadoopBeginner
Jetzt üben

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

Einführung

In den antiken Ruinen einer verlorenen Zivilisation stießen eine Gruppe moderner Entdecker auf einen verborgenen Tempel, der dem Gott der Erkenntnis und Weisheit gewidmet war. Die Wände des Tempels waren mit komplizierten Hieroglyphen verziert, die die Geheimnisse eines fortgeschrittenen Datenverarbeitungssystems enthielten, das von den antiken Priestern genutzt wurde.

Einer der Entdecker, ein geschickter Hadoop-Engineer, übernahm die Rolle eines Hohenpriesters, dechiffrierte die Hieroglyphen und löste die Geheimnisse des Tempels auf. Ziel war es, das antike Datenverarbeitungssystem zu rekonstruieren, indem die Macht des verteilten Caches von Hadoop genutzt wurde, um große Datensätze effizient zu verarbeiten, genauso wie es die antiken Priester vor Jahrhunderten getan hatten.

Vorbereiten des Datensatzes und des Codes

In diesem Schritt werden wir die erforderlichen Dateien und den Code einrichten, um das antike Datenverarbeitungssystem zu simulieren.

Ä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 distributed-cache-lab und navigieren Sie dorthin:

mkdir distributed-cache-lab
cd distributed-cache-lab

Als nächstes erstellen Sie eine Textdatei namens ancient-texts.txt mit dem folgenden Inhalt:

Die Weisheit der Jahrhunderte ist ewig.
Wissen ist der Weg zur Erleuchtung.
Nehmen Sie die Geheimnisse des Universums an.

Diese Datei wird die antiken Texte repräsentieren, die wir verarbeiten möchten.

Erstellen Sie jetzt eine Java-Datei namens AncientTextAnalyzer.java mit dem folgenden Code:

import java.io.BufferedReader;
import java.io.FileReader;
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;
import org.apache.hadoop.util.GenericOptionsParser;

public class AncientTextAnalyzer {

    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();
        String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
        if (otherArgs.length!= 2) {
            System.err.println("Usage: AncientTextAnalyzer <in> <out>");
            System.exit(2);
        }

        Job job = Job.getInstance(conf, "Ancient Text Analyzer");
        job.setJarByClass(AncientTextAnalyzer.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(otherArgs[0]));
        FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));

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

Dieser Code ist ein einfaches MapReduce-Programm, das die Vorkommen jedes Worts in der Eingabedatei zählt. Wir werden diesen Code verwenden, um die Verwendung des verteilten Caches in Hadoop zu demonstrieren.

Kompilieren und Verpacken des Codes

In diesem Schritt werden wir den Java-Code kompilieren und eine JAR-Datei für die Bereitstellung erstellen.

Stellen Sie zunächst sicher, dass die Hadoop-Core-JAR-Datei in Ihrem Klassenpfad vorhanden ist. Sie können sie von der Apache Hadoop-Website herunterladen oder die in Ihrer Hadoop-Installation bereitgestellte verwenden.

Kompilieren Sie die Datei AncientTextAnalyzer.java:

javac -source 8 -target 8 -classpath "/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/*" AncientTextAnalyzer.java

Erstellen Sie jetzt eine JAR-Datei mit den kompilierten Klassendateien:

jar -cvf ancient-text-analyzer.jar AncientTextAnalyzer*.class

Führen Sie den MapReduce-Job mit verteilten Cache aus

In diesem Schritt werden wir den MapReduce-Job ausführen und den verteilten Cache nutzen, um die Eingabedatei an alle Knoten im Cluster zur Verfügung zu stellen.

Kopieren Sie zunächst die Eingabedatei ancient-texts.txt in das Hadoop Distributed File System (HDFS):

hadoop fs -mkdir /input
hadoop fs -put ancient-texts.txt /input/ancient-texts.txt

Als nächstes führen Sie den MapReduce-Job mit der Option für den verteilten Cache aus:

hadoop jar ancient-text-analyzer.jar AncientTextAnalyzer -files ancient-texts.txt /input/ancient-texts.txt /output

Dieser Befehl wird den AncientTextAnalyzer-MapReduce-Job ausführen und die -files-Option verwenden, um die Datei ancient-texts.txt an alle Knoten im Cluster zu verteilen. Der Eingabepfad ist /input/ancient-texts.txt, und der Ausgabepfad ist /output.

Nach Abschluss des Jobs können Sie die Ausgabe überprüfen:

hadoop fs -cat /output/part-r-00000

Sie sollten die Wortzählausgabe sehen, ähnlich wie:

Embrace 1
Knowledge       1
The     1
ages    1
enlightenment.  1
eternal.        1
is      2
mysteries       1
of      2
path    1
the     4
to      1
universe.       1
wisdom  1

Zusammenfassung

In diesem Lab haben wir die Macht der verteilten Cache-Funktion von Hadoop durch die Implementierung eines Systems zur Analyse antiker Texte untersucht. Indem wir den verteilten Cache nutzten, konnten wir die Eingabedatei effizient an alle Knoten im Cluster verteilen, was die parallele Verarbeitung ermöglicht und die Kosten für das Übertragen von Daten über das Netzwerk verringert.

Durch diese praktische Erfahrung habe ich ein tieferes Verständnis dafür gewonnen, wie der verteilte Cache von Hadoop die Datenverarbeitung in verteilten Rechenumgebungen optimieren kann. Indem wir häufig verwendete Daten im gesamten Cluster cachen, können wir die Leistung erheblich verbessern und das Netzwerkverkehr reduzieren, insbesondere wenn es um große Datensätze oder komplexe Berechnungen geht.

Zusätzlich hat mir dieses Lab praktische Erfahrungen bei der Arbeit mit Hadoop MapReduce, Java-Programmierung und der Ausführung von Jobs auf einem Hadoop-Cluster vermittelt. Die Kombination aus theoretischem Wissen und praktischer Übung hat meine Fähigkeiten bei der Verarbeitung von Big Data verbessert und mich auf die Bewältigung von noch komplexeren Hadoop-bezogenen Herausforderungen vorbereitet.