Auf einen Blick: Apache Pig vereinfacht die Datenverarbeitung in Hadoop mit einer SQL-ähnlichen Syntax für MapReduce-Operationen, wobei Datenstrukturen wie Tupel und Bags für intuitive Manipulation verwendet werden.
- Entwickelt von Yahoo, um die Datenverarbeitung von Hadoop zu optimieren.
- Wichtige Operationen umfassen LOAD, GROUP und FOREACH für eine effektive Datenverarbeitung.
Apache Pig 101
Apache Pig, entwickelt bei Yahoo, wurde geschrieben, um die Zusammenarbeit mit Hadoop zu erleichtern. Hadoop wurde von Google entwickelt. Pig ermöglicht es Programmierern, mit Hadoop-Datensätzen zu arbeiten, indem sie eine Syntax verwenden, die SQL ähnelt. Ohne Pig würden Programmierer meist Java verwenden, die Sprache, in der Hadoop geschrieben ist. Aber Java-Code ist von Natur aus wortreich. Es wäre angenehmer, eine einfachere und viel kürzere Möglichkeit zu haben, Hadoop MapReduce-Operationen durchzuführen. Das ist es, was Pig macht.
Aber Pig ist nicht genau SQL. SQL-Programmierer werden tatsächlich einige seiner Datenstrukturen etwas seltsam finden.
Daten in Pig werden in Datenstrukturen dargestellt, sogenannte Tupel, wobei alle anderen Pig-Datenstrukturen eine Variation davon darstellen. In seiner grundlegendsten Form ist ein Tupel eine komma-begrenzte Menge von Werten:
(1,2,3,4,5)
(1,6,7,8,9)
Und wenn man zwei Tupel zusammenführt, in diesem Fall auf dem ersten Element, stellt es die Daten folgendermaßen dar:
Oder das:
(1,2,3,4,5,1,6,7,8,9)
Oder das:
(1, {(1,2,3,4,5), (1,2,3,4,5)})
Im ersten Fall hat Pig alle Elemente zweier Tupel zu einem zusammengeführt. Im zweiten hat es die Join-Kriterien im ersten Element gesetzt und im zweiten einen Beutel erstellt. Ein Beutel ist eine Sammlung von Tupeln. Und einzelne Elemente werden Atome genannt. Pig unterstützt außerdem Abbildungen im Format (Schlüssel#Wert).
Diese seltsamen Strukturen lassen den Programmierer ratlos darüber nachdenken, wie er all das aufwinden kann, um einzelne Atome abzufragen. Wir erklären einige dieser Operationen im Folgenden.
Pig verwenden und wie es funktioniert
Was Pig macht, ist, MapReduce-Operationen über Datensätze hinweg auszuführen. MapReduce ist das grundlegende Konzept hinter Hadoop und Big Data im Allgemeinen. Aber es bedeutet in Hadoop etwas ganz anderes als zum Beispiel Apache Spark oder die Programmiersprache Scala. In Hadoop bedeutet die Map-Operation , Datensätze in Teile zu teilen und parallel an diesen Teilen zu arbeiten. Reduce bedeutet, sie alle wieder zusammenzusetzen, um den gewünschten Datensatz zu liefern. In Spark und Scala bedeutet map, auf jedem Element einer Liste eine Operation auszuführen. Reduce bedeutet, einen endgültigen Einzelwert aus diesen Operationen in Spark zu berechnen.
Man startet Pig im lokalen Modell mit:
pig -x local
Statt nur Schwein:
pig
Dadurch läuft es im Cluster-Modus (auch mapReduce genannt). Das lokale Modell simuliert eine verteilte Architektur. Im Cluster-Modus verwendet mapReduce Apache Yarn, um Jobs auf dem Cluster (also einem Netzwerk von Maschinen) auszuführen, und speichert die resultierenden Daten im HDFS (Hadoop Distributed File System).
Häufige Fehler
Man könnte sagen, dass Pig einige Eigenheiten hat, die das Debuggen von Fehlern erschweren, und die Leute, die Pig pflegen, ändern die Sprache immer wieder leicht. Es gibt normalerweise keine einfachen Fehlermeldungen, zeigt aber in den meisten Fällen einen langen, schwer lesbaren Java-Stack-Trace. (Diese werden als tmp*-Datei im aktuellen Verzeichnis gespeichert.) Bevor wir uns also einige Codebeispiele anschauen, schauen wir uns einige häufige Fehler an, die Ihnen gleich zu Beginn Probleme und Frustration bereiten könnten:
- Du musst prüfen, auf welchem Port HDFS läuft, um dort Dateien öffnen zu können. Schau mal nach $HADOOP_HOME/etc/hadoop/core-site.xml für fs.default.namehdfs://localhost:9000 um die Portnummer zu bekommen.
- Seien Sie vorsichtig, wenn Sie linke und Anführungszeichen aus Google Docs oder einem anderen Textverarbeitungsprogramm in die Pig-Hülle kopieren und einfügen. Pig wird einen Fehler anzeigen, wenn Sie nicht das richtige einzelne Anführungszeichen verwenden (ASCII 27).
- Entweder führst du Pig als Root aus oder verbringst Zeit damit, Berechtigungsprobleme zu sortieren.
- Benutze (control)(-c-) nicht, wenn du einen unvollständigen Befehl eingibst, da er nach weiteren Eingaben fragt. Das wird die Shell verlassen. Einfach "" oder ";" eingeben, bis der aktuelle Befehl beendet ist. Manchmal kann das einige Versuche dauern.
- Geben Sie Befehle in einem Texteditor ein und fügen Sie sie in Pig ein, da Pig das Bearbeiten vorheriger Befehle nicht einfach ermöglicht. Zum Beispiel können Sie den Aufwärtscursor nicht verwenden und dann die vorherige Zeile bearbeiten, wenn sie sich umschließt. Sie können die Historie der Befehle sehen, indem Sie Historie eingeben.
- Wenn du Hadoop und Pig auf deinem Laptop geladen hast, kannst du zum Lernen pig im lokalen Modus ausführen, indem du pig -x local eingibst, falls du java.net.ConnectException-Fehler bekommst. Das bedeutet, dass Yarn oder ein anderer Dienst wahrscheinlich nicht richtig läuft oder konfiguriert ist.
- Obwohl wir Pig einfach genannt haben, kann das frustrierend sein. Zum Beispiel haben wir beim Schreiben dieses Dokuments festgestellt, dass Store ein reserviertes Schlüsselwort ist und nicht als Spaltenname verwendet werden kann. Und beim Schreiben des unten geschriebenen Verkaufsberichts hat es einige Zeit gedauert, das herauszufinden. Pig hat keine freundliche Fehlermeldung wie "Store ist ein reserviertes Schlüsselwort" gesendet.
Datei laden
Wir nehmen an, wir haben eine Datendatei sales.csv wie diese, mit Verkäufen nach Mitarbeiter pro Werkstatt. (Wie wir gerade sagten, können wir Laden nicht für einen Spaltennamen verwenden, da es ein reserviertes Wort ist. Deshalb verwenden wir Laden.)
Laden, Mitarbeiter, Verkauf
Dallas,Sam,30000
Dallas,Fred,40000
Dallas,Jane,20000
Houston,Jim,75000
Houston,Bob,65000
New York,Earl,40000
Wir können Pig verwenden, um Verkäufe nach Laden zu berechnen. Löschen Sie zuerst die erste Zeile, die den Header enthält. Andernfalls wird sie zu einer Zeile in unserem Datensatz. Dann kopieren Sie die Datei in das Hadoop-Distributed File System wie folgt:
hdfs dfs -put sales.csv /user/hadoop/
Jetzt laden wir ihn in Datensatz a. In Pig werden Datensätze Relationen genannt. Hier sagen wir, dass die Eingabedatei komma-getrennt ist, und wir weisen dem Datensatz mit AS ein Schema zu. Wir geben auch die Feldtypen an: Chararray und int.
a = LOAD 'hdfs://localhost:9000/user/hadoop/sales.csv' USING PigStorage(',') AS (shop:chararray,employee:chararray,sales:int);
Dann haben wir dieses Tupel, das wir sehen können, indem wir tippen:
dump a
(Dallas,Sam,30000)
(Dallas,Fred,40000)
(Dallas,Jane,20000)
(Houston,Jim,75000)
(Houston,Bob,65000)
(New York,Earl,40000)
Beachte, dass wir das Schema in der Relation hätten weglassen können. In diesem Fall würden Sie Felder nach ihrer relativen Position $0, $1, $2, ... Beachten Sie auch, dass Pig als faul gilt. Das bedeutet, dass die mapReduce-Funktion tatsächlich erst ausgeführt wird, wenn sie benötigt wird, etwa indem sie die Daten mit Dump ausdruckt.
Wir bitten Pig, uns das Schema des Datensatzes zu zeigen, indem wir beschreiben:
describe a
a: {shop: chararray,employee: chararray,sales: int}
Jetzt gruppieren wir die Daten nach Werkstatt.
b = GROUP a BY shop;
Dann führen wir eine Gruppenoperation durch, wie Zählung, Summe oder Durchschnitt:
c = FOREACH b GENERATE group as shop, SUM (a.sales);
Das ergibt uns die Gesamtumsatzsumme für jeden Shop:
(Dallas,90000)
(Houston,140000)
(New York,40000)
Beachte, dass wir die Sales-Spalte als a.sales bezeichnet haben, selbst nachdem wir die b-Relation erstellt haben.
ForEach
Pig erlaubt es dir, benutzerdefinierte Funktionen (UDF) zu definieren, die über Elemente in einem Tupel im FOREACH-Konstrukt ausgeführt werden. Du kannst diese in Pig, Python, Ruby oder anderen programmieren. Und du kannst sogenannte Sparschwein-Funktionen verwenden, die andere hier geschrieben und beigesteuert haben, oder DataFu verwenden. Pig hat nicht viele eingebaute Funktionen, weshalb Leute eigene hinzufügen.
Aber es macht einfache Arithmetik. Zum Beispiel multiplizieren wir hier jede Verkaufszahl mit 2 und erzeugen so den neuen Datensatz b. Beachten Sie, dass wir auch eine Spalte weggelassen und nur zwei Felder aus dem ursprünglichen Datensatz a genommen haben, um den Datensatz b zu erstellen.
b = FOREACH a GENERATE shop,sales*2
Plattmachen
Angenommen, wir laden einen weiteren Datensatz:
a = LOAD 'hdfs://localhost:9000/user/hadoop/election/health.csv' USING PigStorage(',') As (procedure, provider, name, address, city, state, zipcode, stateName, discharges, aveCharges, avePayments, aveMedicarePayments);
Das nahm diese komma-getrennte Datei und erstellte diese einfache Tupel-Struktur.
describe a
a: {procedure: bytearray,provider: bytearray,name: bytearray,address: bytearray,city: bytearray,state: bytearray,zipcode: bytearray,stateName: bytearray,discharges:
bytearray,aveCharges: bytearray,avePayments: bytearray,aveMedicarePayments: bytearray}
Beachte auch, dass jedes Feld vom Typ bytearray gemacht wurde, was Standard ist, wenn man das nicht explizit definiert.
Jetzt führen wir eine Funktion aus. Wir führen die STRSPLIT-Funktion aus, die zwei Werte erzeugt. Hier sagen wir, dass das Feld aveCharges nach dem "$"-Zeichen (Hex 24) geteilt werden soll. Dieses Feld ist eine Zeichenkette für die Währung $99999. Damit können wir keine Mathematik machen. Deshalb spalten wir das $-Zeichen ab. STRSPLIT gibt ein Tupel mit einem Feld links und einem rechts zurück. In diesem Fall ist das Feld links leer, da das $-Zeichen das erste Zeichen ist. Und das Feld rechts ist der numerische Teil der Zeichenkette.
b = FOREACH a GENERATE (procedure), STRSPLIT(aveCharges, '\\u0024');
Jetzt haben wir ein Tupel von Tupeln, das als Beutel bezeichnet wird, plus das Feldverfahren.
dump b
((948 - SIGNS & SYMPTOMS W/O MCC,$34774.21),(,34774.21))
Wir flachen also das zweite Tupel ab:
c = FOREACH b GENERATE procedure, FLATTEN($1);
Dieses Tupel von Elementen zu erzeugen, um die Arbeit zu erleichtern.
(948 - SIGNS & SYMPTOMS W/O MCC,,15042.00)
Filter
Zurück zu unserem ursprünglichen Datensatz:
(Dallas,Sam,30000)
(Dallas,Fred,40000)
(Dallas,Jane,20000)
(Houston,Jim,75000)
(Houston,Bob,65000)
New York,Earl,40000)
Wir wählen nur Mitarbeiter aus, die mehr als 40.000 Dollar verkauft haben.
Erträge:
x = filter a by sales > 40000
Erträge:
(Houston,Jim,75000)
(Houston,Bob,65000)
Join- und andere Mengenoperationen
In Pig gibt es keine Intersection-Operation, aber es gibt Join. Außerdem gibt es Union, Cogroup, Cross, Union und einige andere. Hier zum Beispiel funktioniert Join. Angenommen, wir haben eine Liste der Studierenden und welchen Kurs sie belegen und dann eine Liste der Kurse und was jeder kostet.
students = LOAD '/root/Downloads/people.txt' USING PigStorage(',') AS (name,class);
(John,German)
(Jane,German)
(Bob,French)
class = LOAD '/root/Downloads/class.txt' USING PigStorage(',') AS (class,fee);
(German,$100)
(French,$200)
Dann verbinden Sie sie mit einem Element, das beiden Tupeln gemeinsam ist.
tuition = join students by class, class by class;
(Bob,French,French,$200)
(Jane,German,German,$100)
(John,German,German,$100)
Das zeigt die Klasse und die Kosten in einer Struktur.
Datentypen
Pig hat eine kleine Menge von Datentypen. Zum Beispiel gibt es keinen Datentyp. Stattdessen gibt es float, boolean, double, bag, map, string, int und einige mehr. Oft ist es notwendig, einen Datentyp wie diesen zu casten: (int) x, oder seinen Typ so zu definieren: x:int.
Rette-Beziehungen
Wenn du die Pig-Shell herunterschließt (dafür verwendest du quit oder [-control-][-c-] ), verlierst du deine Datensätze. Aber sie speichert den Verlauf, sodass du dein Werk neu erstellen kannst. Um deine Ergebnisse dauerhaft zu speichern, verwende:
store x into 'someName
Das auf dem Bildschirm angezeigte Logbuch sagt etwas Lüge:
Successfully stored 2 records in: "file:///root/Downloads/someName"
Das kannst du so betrachten:
cat output
Houston Jim 75000
Houston Bob 65000
Das, wenn wir wieder in Pig laden, wieder ein Tupel ist:
(Houston,Jim,75000)
(Houston,Bob,65000)
Pig ist also ein großartiges Werkzeug für ETL-Operationen (Extract, Transfer, Load) auf Hadoop-Daten. Pig-Programme sind viel kürzer als Java-Code. Und die Grundprinzipien sind nicht kompliziert zu erlernen. Einfachheit war tatsächlich genau das, was Yahoo suchte, als sie die Sprache für ihre eigene interne Nutzung entwickelten.
Hadoop-Leitfaden
- Hadoop-Tutorial für Anfänger: Hadoop-Basics
- Eine Einführung in die Hadoop-Verwaltung
- Einführung in die Hadoop-Sicherheit
- Einführung in den Apache Flume
- Eine Einführung in Hive
- Eine Einführung in HDFS
- Einführung in Hbase
- Hadoop-Beispiele: 5 reale Anwendungsfälle
- Hadoop-Karrieren: Einstellung
- Hadoop-Interviewfragen
- Eine Einführung in die Hadoop-Analyse
- Einführung in Apache Pig
- Eine Einführung in Apache-Garn
- Eine Einführung in die Hadoop-Architektur
- Vorteile und Vorteile von Hadoop
- Hadoop mit Apache Cassandra verwenden
- Hadoop vs Kubernetes: Werden K8s & Cloud Native Hadoop beenden?
- Hadoop-Zertifizierungen
- Hadoop-Cluster: Eine Einführung
- Hadoop-Ökosystem und Komponenten
Diese Beiträge sind meine eigenen und spiegeln nicht unbedingt die Position, Strategien oder Meinung von BMC wider.