Verstehen Sie Map, Shuffle und Reduce

Big DataBeginner
Jetzt üben

Einführung

Die Produktdateien des Einzelhändlers sind geordnet und zugänglich. Nun können Sie die Frage aus dem ersten Lab beantworten: Welche Produktbezeichnungen kommen am häufigsten vor? Einige Zeilen lassen sich von Hand zählen, doch eine wachsende Sammlung benötigt eine wiederholbare Berechnung.

MapReduce ist eine Methode, eine Batch-Berechnung zu organisieren. Map wandelt Eingabedatensätze in Schlüssel-Wert-Paare um; Shuffle führt Werte mit demselben Schlüssel zusammen; Reduce kombiniert die Werte jedes Schlüssels zu einem Ergebnis. Bei WordCount ist der Schlüssel eine Produktbezeichnung, und jedes Vorkommen trägt den Wert 1 bei. Die Wortzählung ist ein kleines Beispiel, das den Datenfluss sichtbar macht, kein vollständiges System zur Verkaufsanalyse.

Sie untersuchen diese Phasen mit einem vorbereiteten Lernwerkzeug und führen dann ein echtes, vorkompiliertes Hadoop-WordCount-Programm mit derselben Eingabe aus. Das Lernwerkzeug gibt die Algorithmusphasen in einem Prozess aus; es ist keine Ablaufaufzeichnung einer verteilten Ausführung. Der Hadoop-Lauf verwendet den lokalen Modus, damit Sie sich auf die Berechnung konzentrieren können, bevor Sie denselben Algorithmus im nächsten Lab auf YARN ausführen. Java- oder Python-Programmierung ist nicht erforderlich.

Wandeln Sie Produktbezeichnungen in Schlüssel-Wert-Paare um

In diesem Schritt prüfen Sie die Eingabe und verfolgen jedes Produktvorkommen durch Map.

Beginnen Sie im lokalen Arbeitsverzeichnis:

cd /home/labex/project

Lesen Sie die sechs Eingabezeilen:

cat /home/labex/project/data/product-words.txt

Erwarteter Text:

notebook pen
notebook folder
pen pen
folder notebook
notebook
folder pen

Halten Sie kurz inne und zählen Sie ein Produkt von Hand. notebook kommt in vier Zeilen jeweils einmal vor; pen kommt insgesamt viermal vor, davon zweimal in der dritten Zeile. folder erscheint dreimal. Das Programm sollte dieselben Summen liefern.

Ein Schlüssel-Wert-Paar verknüpft eine Bezeichnung mit einem Wert. In diesem Algorithmus gibt Map für jedes Vorkommen (product, 1) aus. Zwei Vorkommen von pen erzeugen zwei separate Paare, nicht ein Paar pro Eingabezeile.

Das bereitgestellte ausführbare Werkzeug wordcount-stages erwartet einen Phasennamen und eine lokale Eingabedatei. Verwenden Sie seine Ansicht map:

/home/labex/project/tools/wordcount-stages map /home/labex/project/data/product-words.txt

Die Ausgabe beginnt mit:

notebook 1
pen 1
notebook 1
folder 1

Der Abstand zwischen Schlüssel und Wert ist ein Tabulator. Es gibt elf Paare, eines pro Produktvorkommen. Dieses Werkzeug macht den Algorithmus sichtbar; es startet keine Hadoop-Dienste und plant keine Tasks. Speichern Sie die Phasenausgabe:

/home/labex/project/tools/wordcount-stages map /home/labex/project/data/product-words.txt > /home/labex/project/output/map-pairs.txt

Sie haben die Darstellung der Eingabe geändert: Ganze Zeilen wurden zu Beiträgen, die sich nach Produkt gruppieren lassen.

Gruppieren und reduzieren Sie die Beiträge

In diesem Schritt verfolgen Sie die Paare durch Shuffle und Reduce und verknüpfen die Ausgabe mit Ihrer manuellen Vorhersage.

Map gibt getrennte Beiträge aus. Um ein Produkt zu summieren, müssen seine Beiträge zusammenkommen. Shuffle und Sort ordnen Paare nach Schlüssel, damit ein Reducer die Werte eines bestimmten Produkts erhalten kann. In einem verteilten Job kann dies Datenübertragungen zwischen Tasks erfordern; das Lernwerkzeug zeigt nur die gruppierten Werte.

Prüfen Sie die gruppierte Ansicht:

/home/labex/project/tools/wordcount-stages shuffle /home/labex/project/data/product-words.txt

Erwartete gruppierte Werte:

folder 1,1,1
notebook 1,1,1,1
pen 1,1,1,1

Die Schlüssel sind sortiert. Jede durch Komma getrennte 1 steht weiterhin für ein ursprüngliches Vorkommen und nicht für einen neuen Datensatz. Speichern Sie die Gruppierung:

/home/labex/project/tools/wordcount-stages shuffle /home/labex/project/data/product-words.txt > /home/labex/project/output/shuffled-values.txt

Reduce kombiniert die Werte jedes Schlüssels. Hier addiert es die Ganzzahlen. Eine andere Anwendung könnte Werte anders kombinieren; MapReduce ist nicht auf das Zählen beschränkt.

Prüfen Sie die reduzierte Ansicht:

/home/labex/project/tools/wordcount-stages reduce /home/labex/project/data/product-words.txt

Erwartete Ergebnisse:

folder 3
notebook 4
pen 4

Vergleichen Sie diese Werte mit Ihrer Handzählung aus Schritt 1. Speichern Sie das Ergebnis, um es als Nächstes mit der echten Hadoop-Anwendung vergleichen zu können:

/home/labex/project/tools/wordcount-stages reduce /home/labex/project/data/product-words.txt > /home/labex/project/output/teaching-counts.txt

Das Ergebnis hängt von allen Vorkommen jedes Schlüssels ab, auch wenn sie ursprünglich in unterschiedlichen Zeilen standen. Deshalb liegt die Gruppierungsphase zwischen Map und Reduce.

Führen Sie das echte Hadoop-WordCount-Programm aus

In diesem Schritt führen Sie dieselbe Zählaufgabe mit einem vorkompilierten Hadoop-Beispiel im lokalen Modus aus.

Eine JAR-Datei bündelt Java-Programmcode. Hadoop und sein Beispiel-JAR sind bereits installiert; Sie müssen keinen Code kompilieren. hadoop jar führt das benannte JAR aus; wordcount wählt dessen WordCount-Beispiel. Die beiden Einstellungen mit -D wählen für diesen Aufruf das lokale Ausführungsframework und das lokale Dateisystem. Die letzten beiden Argumente sind die Eingabedatei und ein neues Ausgabeverzeichnis:

hadoop jar /opt/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.5.0.jar wordcount -Dmapreduce.framework.name=local -Dfs.defaultFS=file:/// /home/labex/project/data/product-words.txt /home/labex/project/output/local-wordcount

Warten Sie auf die Eingabeaufforderung. Hadoop gibt Fortschritts- und Diagnosemeldungen aus; Pfade, Kennungen und Zeitangaben variieren. Dies ist ein echtes Hadoop-Programm mit lokalem Runner, keine YARN-Anwendung. Das Lab startet weder HDFS- noch YARN-Dienste, und sowohl Eingabe als auch Ausgabe sind lokal.

Listen Sie das lokale Ausgabeverzeichnis auf:

ls /home/labex/project/output/local-wordcount

Sie sollten einen Marker _SUCCESS und eine Ergebnisdatei part-... sehen. _SUCCESS zeigt den erfolgreichen Abschluss der Ausgabe an; die Ergebnisdatei enthält die Daten, die Sie prüfen müssen. Das Muster part-* der lokalen Shell wählt die Ergebnisdateien aus. Leiten Sie deren zusammengeführten Inhalt durch sort, damit der Vergleich stabil ist:

cat /home/labex/project/output/local-wordcount/part-* | sort > /home/labex/project/output/hadoop-counts.txt

Vergleichen Sie ihn mit den Anzahlen des Lernwerkzeugs:

diff /home/labex/project/output/teaching-counts.txt /home/labex/project/output/hadoop-counts.txt

Es sollten keine Unterschiede erscheinen. Sie haben den erklärten Algorithmus mit echter Programmausgabe verknüpft. Wenn das Ausgabeverzeichnis dieses Laufs bereits existiert, prüfen Sie dessen fertige Dateien, statt es ungeprüft zu löschen oder anzunehmen, eine erneute Übermittlung überschreibe sie.

Eine Unterscheidung wird später wichtig: Ein HDFS-Block speichert Bytes, ein Input Split beschreibt eine Einheit der Eingabearbeit und ein Task führt Arbeit aus. Diese Begriffe hängen zusammen, entsprechen sich aber nicht immer eins zu eins. Ergebnisdateien sind Ausgaben von Verarbeitungstasks und keine Kopien der ursprünglichen Speicherblöcke.

Sagen Sie eine Eingabeänderung voraus und testen Sie sie

In diesem Schritt fügen Sie einer Arbeitskopie ein Produktvorkommen hinzu und testen, welches Ergebnis sich ändert.

Lassen Sie die schreibgeschützte Rohdateneingabe unverändert. Schreiben Sie mit lokalem cat und > eine neue, beschreibbare Arbeitskopie. Beide Pfade sind hier lokal; die Ausgabedatei ist diejenige, die Sie ändern:

cat /home/labex/project/data/product-words.txt > /home/labex/project/output/changed-product-words.txt

Sagen Sie die neuen Anzahlen voraus, wenn Sie ein Vorkommen von notebook anhängen: Nur dessen Summe sollte von 4 auf 5 steigen. printf gibt den angegebenen Text aus, \n bedeutet einen Zeilenumbruch und >> hängt die Ausgabe an, statt vorhandenen Inhalt zu ersetzen:

printf 'notebook\n' >> /home/labex/project/output/changed-product-words.txt

Prüfen Sie die geänderte Eingabe:

cat /home/labex/project/output/changed-product-words.txt

Es sollte eine neue letzte Zeile vorhanden sein. Führen Sie dasselbe Hadoop-Programm aus und ändern Sie nur Eingabe- und Ausgabepfad:

hadoop jar /opt/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.5.0.jar wordcount -Dmapreduce.framework.name=local -Dfs.defaultFS=file:/// /home/labex/project/output/changed-product-words.txt /home/labex/project/output/changed-wordcount

Lesen Sie die tatsächlichen Ergebnisse in sortierter Reihenfolge:

cat /home/labex/project/output/changed-wordcount/part-* | sort

Erwartete Ergebnisse:

folder 3
notebook 5
pen 4

Das neue Map-Paar gehört zur Gruppe notebook, daher ändert sich nur diese Reduce-Summe. Sie können das Ergebnis nun erklären, statt nur einen erfolgreichen Befehl zu erkennen. Im nächsten Lab bleiben Algorithmus und Zählregeln gleich, während HDFS die Eingabe bereitstellt und YARN die Ausführungsressourcen verwaltet.

Zusammenfassung

Sie haben Produktvorkommen in Map-Paare überführt, Werte durch Shuffle gruppiert und durch Reduce kombiniert. Echte Hadoop-WordCount-Ergebnisse stimmten mit Ihrer Handrechnung und dem Lernwerkzeug überein und änderten sich wie vorhergesagt, als ein Eingabevorkommen hinzukam.

Sie haben den lokalen Runner verwendet, um den Algorithmus getrennt zu betrachten. Als Nächstes behalten Sie diesen Algorithmus bei und lernen, wie eine tatsächliche YARN-Anwendung HDFS-Eingaben liest und HDFS-Ergebnisse erzeugt.