Sie können ein einfaches Beispiel verwenden, um zu veranschaulichen, was MapReduce ist:
Wir möchten die Häufigkeit zählen, mit der jedes Wort in einer großen Datei angezeigt wird. Weil die Datei zu groß ist. Wir teilen diese Datei in kleine Dateien und ordnen dann mehrere Personen zum Zählen an. Dieser Prozess ist "Karte". Fusionieren Sie dann die Zahlen, die von jeder Person gezählt wurden, und dies ist "reduziert".
Wenn Sie das obige Beispiel in MapReduce durchführen, müssen Sie einen Aufgabenjob erstellen, der die Datei in mehrere unabhängige Datenblöcke unterteilt und in verschiedenen Maschinenknoten verteilt. Verarbeiten Sie es dann vollständig parallel durch Kartenaufgaben, die in verschiedenen Knoten verstreut sind. MapReduce sammelt die Ausgangsleitungen der Karte und sendet dann die Ergebnisausgabe, um für den nächsten Verarbeitungsschritt zu reduzieren.
Für den spezifischen Ausführungsprozess einer Aufgabe wird ein Prozess namens "JobTracker" für die Koordinierung aller Aufgaben im Ausführungsprozess von MapReduce verantwortlich sein. Mehrere TaskTracker -Prozesse werden verwendet, um separate Kartenaufgaben auszuführen und die Ausführung der Aufgabe jederzeit an JobTracker zu melden. Wenn ein TaskTracker eine Aufgabe meldet oder lange Zeit keine eigene Aufgabe meldet, startet JobTracker einen anderen TaskTracker, um eine separate Kartenaufgabe erneut auszuführen.
(1) Erstellen Sie ein verwandtes Maven-Projekt unter Eclipse, das sich wie folgt auf das JAR-Paket stützt (Sie können sich auch auf die POM-Konfiguration des Hadoop-Maprece-Examples-Projekts unter dem Hadoop-Source-Code-Paket beziehen)
Hinweis: So konfigurieren Sie ein Maven-Plugin Maven-Jar-Plugin und geben Sie die Mainclass an
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-mapreduce-client-core</artifactId> <version>2.5.2</version> </dependency> <dependency> <gruppeId> org.apache.hadoop </Groupid> <artifactId> hadoop-common </artifactId> <version> 2.5.2 </Version> </abhängig> </abhängig> <build> <PLUGINS> <PLUGIN> <Gruppe> org.apache.maven.Plugins </GroupID> <artifactid> <artifactid> <archiv> <ifest> <Mainclass> com.xxx.demo.hadoop.wordcount.wordCount </moryclass> </manifest> </archiv> </configuration> </plugin> </plugins> </build>
(2) Gemäß dem Betriebsmechanismus von MapReduce muss ein Job mindestens drei Klassen schreiben, um die drei Dinge zu vervollständigen: Kartenlogik, Logik reduzieren und Jobplanung.
Der Code von MAP kann org.apache.hadoop.mapreduce.mapper Klasse erben
public static class tokenizermapper erweitert Mapper <objekt, text, text, intwritable> {private endgültige statische intRitable One = new intwrable (1); privates text word = neuer text (); // Da dieses Beispiel nicht den Schlüsselparameter verwendet, wird der Typ des Schlüssels einfach als Objektpublikumspublikum (Objektschlüssel, Textwert, Kontextkontext) ioException, InterruptedException {StringTokenizer itr = new Stringokenizer (value.toString ()) angegeben. while (itr.hasmoretokens ()) {Word.set (itr.NextToken ()); context.write (Wort, eins); }}}Der Code von Reduzierung kann org.apache.hadoop.mapreduce.reducer Klasse erben
Public Class IntsumReDucer erweitert Reduzierer <Text, intRabitable, Text, intwritable> {private intwrable result = new intwribleBable (); public void recond (Textschlüssel, iterable <intRabitable> Werte, Kontextkontext) löst IOException, InterruptedException {int sum = 0; für (intwritable val: Werte) {sum += val.get (); } result.set (sum); context.write (Schlüssel, Ergebnis); }}Schreiben Sie die Hauptmethode für die Arbeitsplanung
public static void main (String [] args) löst eine Ausnahme aus {configuration conf = new configuration (); Job Job = Job.getInstance (conf, "Wortzahl"); Job.setJarByClass (WordCount.Class); Job.SetMapperClass (tokenizermpper.class); Job.SetCombinerClass (intsumReducer.class); Job.SetReDuCerClass (intsumReducer.Class); Job.SetoutputKeyClass (text.class); Job.SetoutputValueClass (intRable.class); FileInputFormat.addinputPath (Job, neuer Pfad (args [0])); FileOutputFormat.SetoutputPath (Job, neuer Pfad (args [1])); Job.waitforCompletion (true); //System.exit(job.waitforCompletion(True)? 0: 1); }Führen Sie die MVN -Installation aus, um das Projekt in eine JAR -Datei einzugeben, und laden Sie es in die Linux -Cluster -Umgebung hoch. Verwenden Sie den Befehl HDFS DFS -MKDIR, um den entsprechenden Befehl im HDFS -Dateisystem zu erstellen. Verwenden Sie HDFS -DFS -Pulieren Sie, um die Datendateien hochzuladen, die in das HDFS -System verarbeitet werden müssen. Beispiel: HDFS DFS -put $ {linux_path/Datendatei} $ {hdfs_path}
Führen Sie den Befehl in einer Cluster -Umgebung aus: Hadoop jar $ {linux_path} /wordCount.jar $ {hdfs_input_path} $ {hdfs_output_path}
HDFS DFS -CAT $ {HDFS_OUTPUT_PATH}/Ausgabedatei Name
Die obige Methode wird im lokalen Modus ausgeführt, wenn die Hadoop -Cluster -Umgebung nicht gestartet wird. Zu diesem Zeitpunkt arbeiten weder HDFs noch Garn. Das Folgende ist die Arbeit, die Sie bei der Ausführung von MapReduce-Job im Pseudo-verteilten Modus ausführen müssen. Zunächst auszahlen Sie die auf der offiziellen Website aufgeführten Schritte:
Konfigurieren Sie den Hostnamen
# vi /etc/sysconfig/network
Zum Beispiel:
Networking = yeshostName = mastervi /etc /hosts
Füllen Sie den folgenden Inhalt aus
127.0.0.1 localhost
Konfigurieren Sie SSH ohne Passwort -Interkommunikation
ssh-keygen -t rsa
# cat?~/.ssh/id_rsa.pub?>>?~/.ssh/authorized_keys
Konfigurieren Sie die Datei core-site.xml (befinden sich unter $ {Hadoop_home}/etc/hadoop/
<Configuration> <Fotive> <name> fs.defaultfs </name> <wert> hdfs: // localhost: 9000 </value> </property> </configuration>
Konfigurieren Sie die HDFS-site.xml-Datei
<Configuration> <Spertices> <name> DFS.Replikation </name> <wert> 1 </value> </Eigenschaft> </Konfiguration>
Der folgende Befehl kann den MapReduce-Job im eigenständigen Pseudo-Verteilungsmodus ausführen
1.Format das Dateisystem:
$ bin/hdfs namenode -format
2.Start Namenode Daemon und Datanode Daemon:
$ sbin/start-dfs.sh
3. Die Ausgabe von Hadoop Dämon -Protokoll wird in das Verzeichnis $ hadoop_log_dir geschrieben (Standardeinstellungen zu $ hadoop_home/logs).4.Browrows der Webschnittstelle für den Namenode; Standardmäßig ist es verfügbar unter:
Namenode - http: // localhost: 50070/
Machen Sie die HDFS -Verzeichnisse, die zur Ausführung von MapReduce -Jobs erforderlich sind:
$ bin /hdfs dfs -mkdir /user
$ bin/hdfs dfs -mkdir/user/<userername>
5.Copy die Eingabedateien in das verteilte Dateisystem:
$ bin/hdfs dfs -put usw./Hadoop -Eingabe
6. Lassen Sie einige der angegebenen Beispiele vorhanden:
$ bin/hadoop jar Share/Hadoop/MapReduce/Hadoop-Maprede-Examples-2.5.2.jar Grep Eingangsausgabe 'DFS [az.]+'
7. Prüfen Sie die Ausgabedateien:
Kopieren Sie die Ausgabedateien aus dem verteilten Dateisystem in das lokale Dateisystem und prüfen Sie sie:$ Bin/HDFS DFS -GE -GET -Ausgabeausgabe
$ cat output/*
oderZeigen Sie die Ausgabedateien im verteilten Dateisystem an:
$ bin/hdfs dfs -cat output/*
8. Wenn Sie fertig sind, stoppen Sie die Dämonen mit:
$ sbin/stop-dfs.sh
Das obige ist der gesamte Inhalt des WordCount -Instanzcodes in diesem Artikel. Ich hoffe, er wird für alle hilfreich sein. Interessierte Freunde können weiterhin auf andere verwandte Themen auf dieser Website verweisen. Wenn es Mängel gibt, hinterlassen Sie bitte eine Nachricht, um darauf hinzuweisen. Vielen Dank an Freunde für Ihre Unterstützung für diese Seite!