3.2 Grundlagen von Pig mit einem Beispiel

  • „Pig“ besteht aus „Pig Latin“, der Sprache, und „Pig Runtime“, der Ausführungsumgebung. Die Verteilung ist vergleichbar mit der Sprache Java und JVM in der Welt von Java.
  • Pig Latin ist an SQL angelehnt und vereinfacht massiv das Entwickeln von Abfragen, da 10 Zeilen von Pig Latin bis zu 200 Zeilen eines MapReduce-Algorithmus ersetzen.
  • Der interne Compiler schreibt die Pig Latin-Anwendungen in MapReduce- oder Tez-Jobs um.
  • Pig arbeitet eine Ebene über MapReduce, da es das Schreiben von MapReduce-Vorgängen durch die Kovertierung des Pig-Codes massiv vereinfacht.
  • Pig ist deutlich schneller als MapReduce in der Verarbeitung der Anfragen, da es sowohl MapReduce als auch Tez für die Verarbeitung seiner Anfragen einsetzt, ohne eine Zeile für MapReduce oder Tez schreiben zu müssen. (Tez wird später im Kurs vorgestellt) 

Wie können Pig-Scripts ausgeführt werden?

  • Weboberfläche von Pig in Ambari
  • Script über die Kommandozeile ausführen

Beispiel: Die besten Filme herausfinden

Um mit Pig einzusteigen, ist es wohl das Beste, ein Beispiel in Pig durchzuführen. Nehmen wir mal an, dass wir herausfinden wollen, welche Filme richtig gut sind, also eine 5-Punkte-Bewertung bekommen haben. 

Das Erste, was wir dafür tun müssen, ist das Laden der Rating-Daten. Dazu muss eine neue „Beziehung“ (SQL: relation) innerhalb von Pig angelegt werden, die den Namen „ratings“ bekommt und ein von uns definiertes Schema bekommt. Sonst würden wir das Einspielen der Daten nur sehr umständlich über eine Map-Funktion hinbekommen. Dies geschieht in Pig mit folgendem Code:

ratings = LOAD '/user/maria_dev/ml-100k/ratings.csv' AS (userID:int, movieID:int, rating:int, ratingTime:int);

Das Skript kreiert folgendes aus unserem Beispieldatensatz:

(660,229,2,891406212)
(421,498,4,892241344)
(495,1091,4,888637503)
(806,421,4,882388897) usw.

Außerdem brauchen wir die „movies.csv“, da sie die movieID dem entsprechenden Kinotitel zuordnen kann. Dies geschieht mit folgendem Code:

metadata = LOAD '/user/maria_dev/ml-100k/movies.csv' USING PigStorage(',')AS (movieID:int, movieTitle:chararray, genre:chararray);
DUMP metadata;

Mit Dump wird das Ergebnis ausgegeben. Außerdem hilft der „DUMP“-Befehl bei Fehlern, da es dann Hinweise zur Ursache bei Verarbeitungsfehlern oder -abbrüchen gibt. 

Als nächstes müssen alle Bewertungen eines Films bzw. einer Film-ID aus dem Datensatz zusammengefasst werden, das bekommen wir mit „GROUP BY“ hin. Das entspricht in etwa einem Reduce-Vorgang. Dazu nehmen wir folgenden Pig-Code:

ratingsByMovie = GROUP ratings BY movieID;
DUMP ratingsByMovie;

Als nächstes müssen wir noch den Durchschnitt der Bewertungen berechnen, damit wir für den Film die Bewertung berechnen können. Das geschieht mit folgendem Code:

avgRatings = FOREACH ratingsByMovie GENERATE group AS movieID, AVG(ratings.rating) AS avgRating;
DUMP avgRatings;

Als Ausgabe erhalten wir dann hier folgendes bei unserem Beispieldaten:

(1,3.5854217851545)
(2,3.2478221546465)
(3,3.0025214785468) usw.

Nun möchten wir ja nur die am höchsten bewerteten Filme zu sehen bekommen. Dies geschieht, indem wir im Code folgenden Filter setzen:

fiveStarMovies = FILTER avgRatings BY avgRating > 4.0;

Anschließend müssen wir unsere verschiedenen Schematas mittels Join zusammenbringen:

fiveStarsWithData = JOIN fiveStarMovies BY movieID, nameLookup BY movieID;

Zum Schluss müssen wir das noch nach Jahr Filtern:

organizedtable = ORDER fiveStarsWithData BY avgRating;
DUMP organizedtable;

Nun können wir das Skript in Ambari laufen lassen. Bitte starte dazu wieder deine virtuelle Maschine und greife auf deine Hadoop-Sandbox zu. Dieses Mal reicht der Zugriff auf Ambari, allerdings bitte mit Admin-Account (!), aus und wähle dort „Files View“. Schaue dort nach, ob unter dem Verzeichnis „user/maria_dev“ der „ml-100k“ existiert und lade hier die beiden Dateien „ratings.csv“ und „movies.csv“ hoch, falls du das noch nicht getan hast. Anschließend öffne bitte „Pig View“. Gehe danach auf „New Script“ oben rechts. Gib bitte als Name „gutealteFilme“ ein. Der Pfad in HDFS ist optional, wir lassen das zweite Feld leer. Klicke danach auf „CREATE“.

Du gelangst danach in einen Skripteditor, in den du nun unseren Code eintragen kannst. Ich habe ihn dir in der folgenden Box nochmal zusammengefasst:

ratings = LOAD '/user/maria_dev/ml-100k/ratings.csv' USING PigStorage(',') AS (userID:int, movieID:int, rating:int, ratingTime:int);
metadata = LOAD '/user/maria_dev/ml-100k/movies.csv' USING PigStorage(',') AS (movieID:int, movieTitle:chararray, genre:chararray);
ratingsByMovie = GROUP ratings BY movieID;
avgRatings = FOREACH ratingsByMovie GENERATE group AS movieID, AVG(ratings.rating) AS avgRating; 
fiveStarMovies = FILTER avgRatings BY avgRating > 4.0;
fiveStarsWithData = JOIN fiveStarMovies BY movieID, metadata BY movieID;
organizedtable = ORDER fiveStarsWithData BY avgRating;
DUMP organizedtable;

Bitte starte nun mit einem Klick aucf „Execute“ die Ausführung. Es dauert meist einige Minuten, bis du das Ergebnis zu sehen bekommst.

Als Ergebnis solltest du folgendes zu sehen bekommen:

Anhand dieser Liste kannst du ganz einfach nachschauen, welche Filme eine sehr gute Durchschnittswertung bekommen haben.

Warum ist Pig und Tez deutlich schneller als Pig mit MapReduce?

Ich hatte dir ja bereits bei Pig erklärt, dass es auch mit Tez statt mit MapReduce als Verarbeitungsschicht umgehen kann. Bitte gehe nun nochmal auf die Seite mit deinem Skript und klicke dort auf den Button „Execute on Tez“ und klicke danach erneut auf „Execute“.

Du wirst bemerken, dass es deutlich schneller geht als mit MapReduce (ungefähr Faktor 10). Warum ist das so? Es wird hierbei eine sogenannte „DAG Engine“ (directed acyclic graph) eingesetzt, welche die Arbeitsabläufe des Algorithmus optimiert. Tez kann dabei die Zusammenhänge zwischen den Daten und der notwendigen Verarbeitung erkennen und berechnet daraus die abzuarbeitenden Schritte im Voraus. Diese Optimierung reduziert die Berechnungszeit auf etwa 10% als die Zeit, die mit MapReduce-Vorgängen benötigt wird.

Weitere Informationen über Pig

Du möchtest weitere Informationen über Pig, der Sprache „Pig Latin“ oder dem Einsatz dessen im Cluster? Dann besuche bitte folgende Seiten, welche ich dir zu dem Thema empfehlen kann:


Weiter geht es mit: 3.3 Grundlagen von Spark