Einführung
Sie haben Map, Shuffle und Reduce verfolgt und einen echten lokalen WordCount-Lauf geprüft. Nun möchte der Einzelhändler dieselbe Zählregel auf Dateien in HDFS anwenden und dafür die Ressourcenverwaltungsdienste der Umgebung nutzen. Die Geschäftsfrage bleibt gleich; die Anordnung von Speicherung und Ausführung ändert sich.
YARN verwaltet Ressourcen für Anwendungen. Sein ResourceManager koordiniert die Ressourcenzuweisung, während ein NodeManager die Ausführung auf einem Arbeitsrechner verwaltet. Jede übermittelte Anwendung besitzt einen ApplicationMaster, der ihre Arbeit koordiniert, und führt Arbeit in zugewiesenen Containern aus: Ressourcenzuweisungen mit darin laufenden Prozessen. Diese YARN-Container sind nicht zwangsläufig Docker-Container.
Sie übermitteln das vorbereitete WordCount-JAR, identifizieren dessen tatsächliche YARN-Anwendung, prüfen ihren abgeschlossenen Zustand und ihre Protokolle und kontrollieren die HDFS-Ergebnisse. Ein zweiter Lauf verwendet einen anderen Ausgabepfad, damit die ursprüngliche Eingabe und das erste Ergebnis verfügbar bleiben. Das Lab bereitet eigene Daten vor und startet die Dienste; Sie benötigen weder die Dateien des vorherigen Labs noch Java-Programmierkenntnisse. Verwenden Sie das Terminal.
Übermitteln Sie den bekannten Algorithmus an YARN
In diesem Schritt bereiten Sie HDFS-Eingaben vor und übermitteln denselben WordCount-Algorithmus mit dem konfigurierten YARN-Framework.
Beginnen Sie in Ihrem lokalen Arbeitsverzeichnis:
cd /home/labex/project
Lesen Sie die vorbereitete Eingabe:
cat /home/labex/project/data/product-words.txt
Dies sind dieselben sechs Zeilen, mit denen der Algorithmus erklärt wurde. Die erwarteten Summen bleiben folder=3, notebook=4 und pen=4. Erstellen Sie ein HDFS-Rohdatenverzeichnis mit einem getrennten übergeordneten Verzeichnis für Ergebnisse:
hdfs dfs -mkdir -p /user/labex/yarn-batch/raw /user/labex/yarn-batch/results
Laden Sie die Eingabe hoch:
hdfs dfs -put /home/labex/project/data/product-words.txt /user/labex/yarn-batch/raw/product-words.txt
Sie wissen bereits, dass -put das lokale Original erhält. Das HDFS-Verzeichnis raw ist die Eingabe des Jobs; results muss außerhalb davon bleiben, damit frühere Ausgaben nicht als neue Eingaben gelesen werden.
Das Beispiel-JAR und der Name wordcount bleiben gegenüber dem lokalen Lauf unverändert. Lassen Sie dieses Mal die Überschreibungen für den lokalen Modus weg: Die installierte Konfiguration verwendet mapreduce.framework.name=yarn und HDFS als Standarddateisystem. Beide letzten Argumente sind daher HDFS-Pfade. Der Job erstellt sein eigenes Ausgabeverzeichnis run-1, das noch nicht existieren darf:
hadoop jar /opt/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.5.0.jar wordcount /user/labex/yarn-batch/raw /user/labex/yarn-batch/results/run-1
Warten Sie, bis der Befehl zurückkehrt. Er gibt eine übermittelte Anwendungs-ID aus, gefolgt von Jobfortschritt und einer Erfolgsmeldung. Anwendungs- und Job-IDs, Zeitangaben und die Reihenfolge der Fortschrittsmeldungen variieren. Sie müssen keinen flüchtigen Zustand RUNNING erwischen; auch abgeschlossene Anwendungen lassen sich untersuchen.
Verknüpfen Sie den Befehl mit den Rollen:
Client übermittelt Anwendung → ResourceManager weist Ressourcen zu
ApplicationMaster koordiniert MapReduce-Arbeit → NodeManager führt Container aus
Tasks lesen HDFS-Eingaben → Tasks schreiben HDFS-Ergebnisse
Dies ist weiterhin eine Lernumgebung auf einem einzelnen Rechner. Die YARN-Rollen sind echt, auch wenn ihre Prozesse denselben Rechner teilen. Als Nächstes fragen Sie YARN nach einem direkten Beleg für den erfolgreichen Abschluss der Anwendung.
Untersuchen Sie die abgeschlossene Anwendung
In diesem Schritt bewahren Sie die tatsächliche Anwendungs-ID auf und fragen damit Status und zusammengeführte Protokolle ab.
YARN vergibt eine Anwendungs-ID (Application ID), wenn es eine Anwendung annimmt. Diese unterscheidet sich von einem HDFS-Pfad oder einem Ergebnisdateinamen. Listen Sie alle Anwendungszustände einschließlich abgeschlossener Anwendungen auf:
yarn application -list -appStates ALL
In dieser frischen Umgebung wurde eine Anwendung übermittelt. Ihr Typ sollte MAPREDUCE, ihr Zustand FINISHED und ihr Abschlussstatus SUCCEEDED sein. FINISHED allein beweist keinen Erfolg: Auch der Abschlussstatus zählt.
Speichern Sie die tatsächliche Anwendungs-ID, ohne einen Beispielwert zu kopieren. Die folgende Pipeline verwendet grep -o, um nur den passenden Teil auszugeben. In diesem Muster passt [0-9]* auf die Ziffernfolgen einer Anwendungs-ID:
yarn application -list -appStates ALL | grep -o 'application_[0-9]*_[0-9]*' > /home/labex/project/output/application-id.txt
Lesen Sie die erfasste ID:
cat /home/labex/project/output/application-id.txt
Sie sollten eine Zeile sehen, die mit application_ beginnt. Der Rest wird von dieser Umgebung vergeben; verwenden Sie keine ID einer anderen Person.
Um den gespeicherten Wert in einen Befehl einzusetzen, führt $(cat ...) den Befehl cat aus und setzt dessen Ausgabe ein. Doppelte Anführungszeichen halten den eingesetzten Wert als ein Argument zusammen. Fragen Sie diese tatsächliche Anwendung ab:
yarn application -status "$(cat /home/labex/project/output/application-id.txt)"
Suchen Sie State, Final-State und Application-Type. Erwarten Sie FINISHED, SUCCEEDED und MAPREDUCE. Speichern Sie den Bericht:
yarn application -status "$(cat /home/labex/project/output/application-id.txt)" > /home/labex/project/output/application-status.txt
YARN sammelt auch Containerprotokolle. Der Befehl logs -applicationId liest sie für die ausgewählte Anwendung. Speichern Sie die Protokolle lokal, damit Sie einen überschaubaren Ausschnitt untersuchen können:
yarn logs -applicationId "$(cat /home/labex/project/output/application-id.txt)" > /home/labex/project/output/application.log
Zeigen Sie mit dem lokalen Befehl tail -n 20 die letzten zwanzig Zeilen an:
tail -n 20 /home/labex/project/output/application.log
Die genauen Protokollmeldungen variieren. Containerüberschriften und Taskmeldungen verbinden die Anwendung mit der Arbeit, die YARN tatsächlich ausgeführt hat. Protokolle helfen, Verhalten zu erklären; der erfolgreiche Zustand zusammen mit korrekten Geschäftsergebnissen ist ein stärkerer Beleg als eine einzelne beruhigende Protokollzeile. Im nächsten Lab verwenden Sie dieselben Diagnosewerkzeuge für Fehler.
Prüfen und wiederholen Sie den Lauf ohne Verunreinigung der Eingabe
In diesem Schritt prüfen Sie die Ergebnisdaten, exportieren sie und wiederholen den Lauf mit einem zweiten Ausgabepfad.
Listen Sie das erste Ergebnisverzeichnis auf:
hdfs dfs -ls /user/labex/yarn-batch/results/run-1
Der Marker _SUCCESS zeigt die abgeschlossene Ausgabe an. Die Dateien part-* enthalten die Anzahlen. Verwenden Sie wie zuvor ein HDFS-Muster in Anführungszeichen und sortieren Sie die Datensätze für eine stabile Prüfung:
hdfs dfs -cat '/user/labex/yarn-batch/results/run-1/part-*' | sort
Erwartetes Ergebnis:
folder 3
notebook 4
pen 4
Speichern Sie mit der Methode des Zurücklesens einen sortierten lokalen Export:
hdfs dfs -cat '/user/labex/yarn-batch/results/run-1/part-*' | sort > /home/labex/project/output/run-1-counts.txt
Sagen Sie vor dem nächsten Lauf voraus, ob eine weitere Ausführung mit identischer Eingabe die Anzahlen verändern sollte. Das sollte sie nicht. Ein neuer Ausgabepfad erhält das erste Ergebnis und vermeidet den Fehler wegen einer bereits vorhandenen Ausgabe:
hadoop jar /opt/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.5.0.jar wordcount /user/labex/yarn-batch/raw /user/labex/yarn-batch/results/run-2
Lesen und speichern Sie nach erfolgreichem Abschluss die sortierten Anzahlen des zweiten Laufs:
hdfs dfs -cat '/user/labex/yarn-batch/results/run-2/part-*' | sort > /home/labex/project/output/run-2-counts.txt
Vergleichen Sie die beiden lokalen Exporte:
diff /home/labex/project/output/run-1-counts.txt /home/labex/project/output/run-2-counts.txt
Es sollten keine Unterschiede erscheinen. Die Ergebnisse liegen nebeneinander außerhalb des Rohdatenverzeichnisses. Deshalb wurde beim erneuten Lauf die frühere Ausgabe nicht dem nächsten Eingabebatch hinzugefügt. Sie haben nun eine tatsächliche Anwendung, ihre Protokolle, ihre Ergebnisdaten und wiederholbares Verhalten geprüft, ohne den Algorithmus zu verändern.
Zusammenfassung
Sie haben einen bekannten Zählalgorithmus von lokaler Ausführung auf HDFS und YARN übertragen. Sie haben eine echte MapReduce-Anwendung identifiziert, den erfolgreichen Abschluss und Containerprotokolle untersucht und korrekte Ergebnisse aus zwei Ausgabepfaden geprüft.
Der Algorithmus blieb gleich, während sich Speicherung und Ressourcenverwaltung änderten. Als Nächstes lernen Sie, clientseitige Probleme von Fehlern einer bereits übermittelten Anwendung zu unterscheiden und die jeweils kleinste passende Korrektur vorzunehmen.



