Dies ist ein Java -Programm zum Erstellen eines invertierten Wörterindex, der in einem großen Satz von Dokumenten auftritt, die von Webseiten mit Hadoop MapReduce und Google DataProc extrahiert werden.
Als Datensatz verwenden wir eine Teilmenge von 74 Dateien aus insgesamt 408 Dateien (Text aus HTML -Tags extrahiert) aus dem hier verfügbaren Stanford -Webbase -Projekt. Es wurde aus einem Webcrawl im Februar 2007 erhalten. Es ist eine der größten Sammlungen mit insgesamt mehr als 100 Millionen Webseiten von mehr als 50.000 Websites. Diese Version wurde bereits gereinigt.
In diesem Projekt haben wir zunächst einen Beispiel-Hadoop-Cluster mit dem lokalen Modus (Standalone) eingerichtet und dann das tatsächliche Projekt im vollverteilten Modus im Google DataProc im tatsächlichen Datensatz implementieren.
Wir müssen das Projekt auf GNU/Linux einrichten, da es sich um die unterstützte Entwicklungs- und Produktionsplattform für Hadoop handelt. Um eine Hadoop -Distribution zu erhalten, laden Sie eine aktuelle stabile Version von einem der Apache -Download -Spiegel herunter. Bitte beachten Sie, dass dieses Projekt mit hadoop-3.1.1 eingesetzt und getestet wurde. Packen Sie die heruntergeladene Hadoop -Distribution aus. Bearbeiten Sie im Ordner Verteilungsordner die Datei etc/hadoop/hadoop-env.sh , um die Umgebungsvariablenparameter wie folgt zu definieren:
# add these line to the hadoop-env.sh or set them in terminal
export JAVA_HOME=/usr/java/latest
export PATH= ${JAVA_HOME} /bin: ${PATH}
export HADOOP_CLASSPATH= ${JAVA_HOME} /lib/tools.jarVersuchen Sie dann den folgenden Befehl:
$ bin/hadoopDies sollte die Verwendungsdokumentation für das Hadoop -Skript anzeigen. Jetzt sind Sie bereit, Ihren Hadoop -Cluster im eigenständigen Modus zu starten.
Dieser einfache Hadoop -Job erhält zwei Textdateien aus dem Ordner "Eingabe" als Argumente des Mapper.
# file01
5722018411 Hello World Bye World # file02
6722018415 Hello Hadoop Goodbye HadoopUnd indem Sie einen Hadoop -Job einreichen und den Schritt reduzieren, generiert er einen umgekehrten Index wie unten:
bye 5722018411:1
goodbye 6722018415:1
hadoop 6722018415:2
hello 5722018411:1 6722018415:1
world 5722018411:2 Um einen Hadoop -Job einzureichen, sollte die MadReduce -Implementierung als jar -Datei verpackt werden. Kopieren Sie dazu die InvertedIndex.java -Datei dieses Projekts in den Distribution Root -Ordner des Hadoop und führen, während Sie noch dort sind, die folgenden Befehle, um InvertedIndex.java zu kompilieren und eine jar -Datei zu erstellen.
$ bin/hadoop com.sun.tools.javac.Main InvertedIndex.java
$ jar cf invertedindex.jar InvertedIndex * .class Kopieren Sie input/file01 und input/file02 dieses Projekts und platzieren Sie sie in den input des Hadoop -Verbrennungsordners. Führen Sie während Sie weiterhin dort sind, führen Sie den folgenden Befehl aus, um den Job zu senden, die Eingabedateien aus input abzurufen, den invertierten Index zu generieren und seine Ausgabe im output zu speichern:
$ bin/hadoop jar invertedindex.jar InvertedIndex input outputUnd schließlich, um die Ausgabe zu sehen, führen Sie den folgenden Befehl aus:
$ bin/hadoop dfs -cat output/part-r-00000 In diesem Abschnitt erstellen wir einen Cluster mit 3 Worker -Knoten auf Google DataProc und führen invertedindex.jar auf dem tatsächlichen Datensatz aus.
Zuerst benötigen wir ein Konto auf der Google Cloud -Plattform. Sie können sich für eine Testversion mit einem kostenlosen Credits in Höhe von 300 US -Dollar anmelden, wenn Sie noch keine haben.
Erstellen Sie in der Google Cloud -Konsole entweder ein neues Projekt oder wählen Sie ein vorhandenes aus. Für diese Übung werden wir DataProc verwenden. Mit DataProc können wir schnell eine Gruppe von Recheninstanzen erstellen, die Hadoop ausführen. Die Alternative zu DataProc würde darin bestehen, jeden Rechenknoten einzeln einzeln einzurichten, Hadoop darauf zu installieren, HDFs einzurichten, einen Master -Knoten usw. einzurichten usw. DataProc automatisiert diesen Anstrengungsvorgang für uns.
Wählen Sie in Google Cloud Consol DataProc aus der Navigationsliste links aus. Wenn Sie das erste Mal DataProc verwenden, müssen Sie möglicherweise zuerst die DataProc -API aktivieren. Wenn Sie auf 'Cluster erstellen' erstellen, werden Sie in den Abschnitt Cluster -Konfiguration gelangen. Geben Sie Ihrem Cluster einen einzigartigen Namen und wählen Sie eine gewünschte Zone aus. Sie müssen einen Master- und 3 Arbeiterknoten erstellen. Wählen Sie die Standardkonfigurationsprozessoren (N1-Standard-4 4VCPU 15 GB Speicher) für Master und jedes Mitglied aus und reduzieren Sie den Speicher auf 32 GB HDD-Speicher. Ändern Sie die Anzahl der Arbeiterknoten auf 3. Lassen Sie alles andere standardmäßig und klicken Sie auf "Erstellen".
Nachdem der Cluster eingerichtet ist, müssen wir ihn ein wenig konfigurieren, bevor wir Jobs darauf ausführen können. Wählen Sie den Cluster aus, den Sie gerade aus der Liste der Cluster im Abschnitt Cloud DataProc in Ihrer Konsole erstellt haben. Gehen Sie zur Registerkarte VM Instances und klicken Sie mit der Meisterrolle auf die SSH -Schaltfläche neben der Instanz.
Wenn Sie auf die SSH -Schaltfläche klicken, werden Sie wie ein Xterm oder ein Terminal zu einer Befehlszeilenschnittstelle (CLI) geführt. Alle Befehle in den folgenden Schritten sollen in die CLI eingegeben werden. Es gibt kein Home -Verzeichnis auf HDFS für den aktuellen Benutzer. Wir müssen dies einrichten, bevor wir weiter fortfahren. (Um herauszufinden, dass Ihr Benutzername whoami ausgeführt hat)
$ hadoop fs -mkdir -p /user/ < your username here > JAVA_HOME wurde bereits eingerichtet und wir müssen es nicht wieder einrichten.
Bitte beachten Sie, dass dieser Schritt jedes Mal durchgeführt werden muss, wenn Sie ein neues SSH -Terminal öffnen. Um diesen Schritt zu beseitigen, können Sie dies auch JAVA_HOME , PATH und HADOOP_CLASSPATH in der etc/hadoop/hadoop-env.sh einrichten.
$ export PATH= ${JAVA_HOME} /bin: ${PATH}
$ export HADOOP_CLASSPATH= ${JAVA_HOME} /lib/tools.jarJetzt laufen:
$ hadoop fs -lsWenn es keinen Fehler gibt, bedeutet dies, dass Ihr Cluster erfolgreich eingerichtet wurde. Wenn Sie auf einen Fehler stoßen, ist dies höchstwahrscheinlich aufgrund einer fehlenden Umgebungsvariablen oder einem nicht richtigen Einrichtungsverzeichnis des Benutzer -Home -Verzeichnisses.
Um sicherzustellen, dass die Umgebungsvariablen festgelegt werden, führen Sie die env aus.
Hinweis : Bitte deaktivieren Sie die Abrechnung für den Cluster, wenn Sie sie nicht verwenden. Das Laufen zu lassen, kostet zusätzliche Credits.
Laden Sie den Datensatz von diesem Link herunter und entpacken Sie den Inhalt. Sie finden zwei Ordner im Inneren "Development" und "Volldaten". "Entwicklung" Daten können für Entwicklung und Testzwecke verwendet werden.
Klicken Sie im Menü "DataProc" auf "DataProc". Suchen Sie als Nächstes die Adresse des Standard -Google Cloud Storage Staging -Bucket für Ihren Cluster.
Gehen Sie zum Speicherbereich in der linken Navigationsleiste und wählen Sie den Standard -Eimer Ihres Clusters aus der Liste der Eimer aus. Klicken Sie auf die Schaltfläche Upload Folder und die Ordner devdata und fulldata einzeln hochladen.
Jetzt sind wir bereit, einen Hadoop -Job einzureichen, um unsere MapReduce -Implementierung für die tatsächlichen Daten auszuführen. Verwenden Sie entweder den Befehl ssh oder nano / vi , um InvertedIndex.java auf dem Master -Cluster zu kopieren oder zu erstellen.
Führen Sie den folgenden Befehl aus, um die jar -Datei zu erstellen:
$ hadoop com.sun.tools.javac.Main InvertedIndex.java
$ jar cf invertedindex.jar InvertedIndex * .classJetzt haben Sie eine JAR -Datei für Ihren Job. Sie müssen diese JAR -Datei in den Standard -Cloud -Eimer Ihres Clusters aufstellen. Erstellen Sie einfach einen Ordner namens Jar auf Ihrem Eimer und laden Sie ihn in diesen Ordner hoch. Wenn Sie Ihre JAR -Datei auf dem Masterknoten des Clusters selbst erstellt haben, verwenden Sie die folgenden Befehle, um sie in den JAR -Ordner zu kopieren.
$ hadoop fs -copyFromLocal ./invertedindex.jar
$ hadoop fs -cp ./invertedindex.jar gs://dataproc-69070.../JAR Der gs://dataproc-69070... Teil ist der Standard-Eimer Ihres Clusters. Es muss von der GS: // vorbereitet werden, um der Hadoop -Umgebung zu sagen, dass es sich um einen Eimer und kein regulärer Ort im Dateisystem handelt.
Gehen Sie zum Abschnitt "Jobs" in der linken Navigationsleiste der DataProc -Seite und klicken Sie auf "Jobs Senden". Füllen Sie die Jobparameter wie folgt aus:
gs:///dataproc-69070.../JAR/invertedindex.jar .gs:///dataproc-69070.../fulldatags:///dataproc-69070.../fulloutput Der Ordner wird während der Ausführung erstellt. Sie erhalten einen Fehler, wenn Sie den Namen eines vorhandenen Ordners angeben.Senden Sie nun den Job ein. Sie können das Protokoll sehen, während es ausgeführt wird.
HINWEIS : Wenn Sie auf eine Java.lang.Interrupted Exception stoßen, können Sie sie sicher ignorieren. Ihr Job wird weiterhin ausgeführt.
Die Ausgabedateien werden im Ausgangsordner auf dem Eimer gespeichert. Wenn Sie diesen Ordner öffnen, werden Sie feststellen, dass sich der invertierte Index in mehreren Segmenten befindet. (Löschen Sie die _success -Datei im Ordner, bevor Sie alle Ausgabedateien zusammenschließen). Um die Dateien zusammenzuführen und einen endgültigen Textausgang zu erstellen, führen Sie die folgenden Befehle aus:
$ hadoop fs -getmerge gs://dataproc-69070.../fulloutput ./output.txt
$ hadoop fs -copyFromLocal ./output.txt
$ hadoop fs -cp ./output.txt gs://dataproc-69070.../output.txt Jetzt haben Sie erfolgreich einen umgekehrten Index des gesamten Datensatzes erstellt. Sie können grep verwenden, um Indexeinträge für jedes apecifische Wort anzuzeigen:
$ grep -w ' ^peace ' output.txt Wenn Sie einen neuen Job erneut kompilieren und erneut einreichen möchten, können Sie die Dateien .jar , .class , .java und Hadoop mit dem folgenden Befehl entsprechend entfernen.
$ hadoop fs -rm ./wordcount.jar ./output.txt WordCount * .class
$ hadoop fs -rm gs://dataproc-69070.../JAR/wordcount.jar ; gs://dataproc-69070.../output.txt
$ hadoop fs -rm gs://dataproc-69070.../fulloutput/ *
$ hadoop fs -rmdir gs://dataproc-69070.../fulloutput
Diese Arbeit ist unter einer internationalen Lizenz für Creative Commons zuzuschreiben.