In diesem Beitrag möchte ich den bestehenden Hadoop-Job verbessern, den ich zuvor erstellt habe: wiki-pagerank-with-hadoop
Die Ziele:
-
- Aktualisieren Sie auf die neue stabile Hadoop-Version.
- Verwenden Sie die neue API.
- Richten Sie einen Hadoop-Cluster mit einem Knoten ein.
- Erstellen Sie ganz einfach ein Job-Jar mit Maven.
Ich habe die Version 0.20.204.0 für die ersten Hadoop-Jobs verwendet. Die Hadoop-Committer waren in der Zwischenzeit sehr fleißig. Die letzte stabile Version ist derzeit 2.2.0.
1. Hadoop-Version aktualisieren
Um auf die neueste Version zu aktualisieren, müssen Sie lediglich die Version in der pom.xml aktualisieren und Maven erledigt den Rest für Sie, solange die Version im Repository verfügbar ist. In meinem pom habe ich den Spiegel ibiblio konfiguriert, der die neueste Version von Hadoop enthält. Die Client-Klassen zum Erstellen eines Jobs befinden sich jetzt in einer separaten Abhängigkeit.
... org.apache.hadoop Hadoop-Kern 2.2.0 org.apache.hadoop hadoop-client 2.2.0 ...
Lassen Sie uns die neue Version herunterladen
mvn clean kompilieren
2. Neue API verwenden
In der IDE habe ich festgestellt, dass die Klassen aus org.apache.hadoop.mapred.* nicht mehr veraltet sind. In der alten Version sind einige der Klassen als veraltet gekennzeichnet, weil zu dieser Zeit eine neue API verfügbar war. Die alte API ist nicht veraltet, denn sie wird beibehalten. Hinweis: Sowohl die alte als auch die neue API werden funktionieren.
Hier finden Sie einen Überblick über die wichtigsten Änderungen:
| Was | Alte | Neu |
|---|---|---|
| Klassen Standort | org.apache.hadoop.mapred | org.apache.hadoop.mapreduce |
| conf-Klasse | JobConf | Konfiguration |
| map-Methode | map(k1, v1, OutputCollector | map(k1, v1, Kontext) |
| Methode reduzieren | reduzieren(k2, Iterator | reduzieren(k2, Iterable |
| Methode reduzieren | while (Werte.hasNext()) | for (v2 Wert : Werte) |
| abbilden/verringern | throws IOException | throws IOException, InterruptedException |
| vor Map/Reduce | setup(Context ctx) | |
| nach map/reduce | close() | cleanup(Kontext ctx) |
| Client-Klasse | JobConf / JobClient | Job |
| Auftrag ausführen | JobClient.runJob(job) | job.waitForCompletion(true) |
Die Umstellung auf die neue API war nicht so schwierig. Löschen Sie alle Importe mit org.apache.hadoop.mapred.* und importieren Sie sie mit dem richtigen Paket erneut. Beheben Sie dann alle Fehler einen nach dem anderen. Sie können den neuen Code und die Änderungen, die ich zur Unterstützung der neuen API vorgenommen habe, auf github nachlesen. Die Funktionalität wurde nicht geändert.
Alte Api:
öffentlich Klasse RankCalculateMapper erweitert MapReduceBase implementiert MapperLongWritable, Text, Text, Text>{ public void map(LongWritable key, Text value, OutputCollectorText, Text> Ausgabe, Reporter Reporter) wirft IOException { ... Ausgabe.sammeln(neu Text(Seite), neu Text("|"+Links)); } }
Neue Api:
öffentlich Klasse RankCalculateMapper erweitert MapperLongWritable, Text, Text, Text> { öffentlich void Karte(LongWritable Schlüssel, Text Wert, Kontext Kontext) wirft IOException, InterruptedException { ... Kontext.Schreiben Sie(neu Text(Seite), neu Text("|" + Links)); } }
3. Richten Sie einen Hadoop-Cluster mit einem Knoten ein.
Im letzten Beitrag hatte ich ein Plugin für Eclipse vorgestellt, mit dem die Hauptklasse direkt im Hadoop-Cluster ausgeführt werden kann. Eigentlich erstellt das Plugin das Job-Jar und sendet es an den Cluster. Da ich von der IDE gewechselt habe, kann ich das Plugin nicht mehr verwenden und ich möchte einen unabhängigen Job-Builder, damit der Job ohne Eclipse erstellt und ausgeführt werden kann. Heutzutage ist es sehr einfach, einen eigenen Single-Node-Cluster zu installieren.
Installieren Sie eine virtuelle Maschine: VirtualBox oder VMwarePlayer und laden Sie eine Schnellstart-Distribution von Ihrem bevorzugten Anbieter herunter:
- Cloudera: http://go.cloudera.com/vm-download
- Hortonworks: http://hortonworks.com/products/hortonworks-sandbox/
Nach dem Start der virtuellen Maschine ist ein 'Cluster' verfügbar! (Pseudo-verteilter Modus) Außerhalb der virtuellen Maschine, von Ihrem eigenen Rechner aus, sollten Sie auf die HUE-Seite http://localhost:8888 zugreifen können.
Um Dateien zwischen Host und virtueller Maschine zu verschieben, gibt es mehrere Möglichkeiten.
- Konfigurieren Sie einen gemeinsamen Ordner.
- Verwenden Sie das HUE Webinterface zum Hochladen von Dateien
- Verwenden Sie eine sichere Kopie über ssh.
Ich habe mich für Option 3 entschieden: scp. Für diese Option muss ich über ssh auf Port 22 auf die virtuelle Maschine zugreifen. Meine VirtualBox wurde mit den Netzwerkeinstellungen NAT und Port-Forwarding konfiguriert. Ich habe eine Port-Forwarding-Regel für den Host von Port 2222 zu Guest 22 hinzugefügt.
Jetzt kann ich Dateien von meinem Rechner auf die virtuelle Maschine kopieren:
scp -P 2222 data_subset.xml cloudera@localhost:~
Auf der virtuellen Maschine sollten wir die Daten im HDFS an der richtigen Stelle hinzufügen.
hadoop fs -mkdir wiki hadoop fs -mkdir wiki/in hadoop fs -put data_subset.xml /user/cloudera/wiki/in/
3. Erstellen Sie ganz einfach ein Job-Jar mit Maven.
Bei der ursprünglichen Einrichtung waren der Code und Eclipse eng miteinander verbunden. Um ein separates jar zu erstellen, habe ich das maven-assembly-plugin verwendet. Stellen Sie sicher, dass Sie hadoop-common und hadoop-client nicht in Ihr jar aufnehmen, indem Sie diese Abhängigkeiten als scope: provided markieren. Die nicht als scope test/provided markierten Abhängigkeiten wie commons-io werden in Ihrem jar enthalten sein.
... maven-assembly-plugin 2.4 jar-with-dependencies org.apache.hadoop hadoop-gemeinsam 2.2.0 bereitgestellt org.apache.hadoop hadoop-client 2.2.0 bereitgestellt ...
Jetzt können Sie Ihren Auftrag erstellen:
mvn assembly:assembly [INFO] --- maven-assembly-plugin:2.4:assembly (default-cli) @ hadoop-wiki-pageranking --- [INFO] Jar bauen: /Users/abij/projects/github/hadoop-wiki-pageranking/target/hadoop-wiki-pageranking-0.2-SNAPSHOT-jar-mit-Abhängigkeiten.jar [INFO] ------------------------------------------------------------------------ [INFO] ERFOLG MACHEN [INFO] ------------------------------------------------------------------------ [INFO] Gesamtzeit: 2.590s [INFO] Beendet am: Fr Jan 31 13:25:18 CET 2014 [INFO] Endgültiger Speicher: 15M/313M [INFO] ------------------------------------------------------------------------
Kopieren Sie nun den frisch gebackenen Auftrag auf den Cluster und führen Sie ihn aus. Lokaler Rechner:
scp -P 2222 hadoop-wiki-pageranking-*-dependencies.jar cloudera@localhost:~
Virtuelle Maschine:
hadoop jar hadoop-wiki-*.jar com.xebia.sandbox.hadoop.WikiPageRanking
Sehen Sie sich den Vorgang in HUE an: http://localhost:8888/jobbrowser/
Rekapitulieren Sie
In diesem Blog haben wir den Map-Reduce-Job von Vanilla Hadoop von der alten API auf die neue API aktualisiert. Die Aktualisierung war nicht schwer, berührt aber alle Klassen. Wir haben Maven verwendet, um aus dem Code einen Job zu generieren und ihn in einem Cluster auszuführen. Der neue Quellcode ist auf meinem Github verfügbar
Unsere Ideen
Weitere Blogs
Contact


