Hadoop Pig Tutorial: Hvad er Apache Pig? Architecture, Eksempel
โก Smart opsummering
Apache Pig er en platform pรฅ hรธjt niveau til analyse af store datasรฆt pรฅ Hadoop, der parrer dataflowsproget Pig Latin med en runtime, der kompilerer hvert script til MapReduce, Tez eller ... Spark job automatisk.
Denne vejledning starter med ideen bag Apache Pig og gennemgรฅr derefter installationen og kรธrsel af et komplet latinsk Pig-script fra ende til anden.
Hvad er Apache Pig?
Gris er pรฅ hรธjt niveau programmeringssprog nyttig til analyse af store datasรฆt. Pig var et resultat af udviklingsindsatsen hos Yahoo!
I et MapReduce-framework skal programmer oversรฆttes til en rรฆkke Map- og Reduce-faser. Dette er dog ikke en programmeringsmodel, som dataanalytikere er bekendt med. Sรฅ for at bygge bro over dette hul, er der behov for en abstraction kaldet Pig blev bygget oven pรฅ Hadoop.
Apache Pig gรธr det muligt for folk at fokusere mere pรฅ at analysere store mรฆngder data og bruge mindre tid pรฅ at skrive MapReduce-programmer. Ligesom grise, der spiser hvad som helst, er programmeringssproget Apache Pig designet til at arbejde med alle former for data. Derfor navnet Pig! Projektets maskot nedenfor understreger det samme.
Projektet er stadig aktivt. Apache Pig 0.18.0 blev udgivet den 15. september 2025 og tilfรธjer understรธttelse af Hadoop 3, Tez 0.10, Hive 3, Spark 3, HBase 2 og Python 3, ifรธlge Apache Pig-udgivelsessideGennemgangen nedenfor blev oprindeligt skrevet til den meget รฆldre 0.12.1-linje, sรฅ et par trin indeholder en bemรฆrkning, hvor en nuvรฆrende udgivelse opfรธrer sig anderledes.
Gris Architecture
Pigs arkitektur bestรฅr af to komponenter:
- Grise latin, som er et sprog
- Et runtime miljรธ, til at kรธre Pig Latin-programmer.
Et Pig Latin-program bestรฅr af en rรฆkke operationer eller transformationer, der anvendes pรฅ inputdataene for at producere output. Disse operationer beskriver en datastrรธm, der oversรฆttes til en eksekverbar reprรฆsentation af Hadoop Pig-eksekveringsmiljรธet. Nedenfor er resultaterne af disse transformationer en rรฆkke KortReducer job, som en programmรธr ikke er klar over. Sรฅ pรฅ en mรฅde giver Pig i Hadoop programmรธren mulighed for at fokusere pรฅ data snarere end pรฅ udfรธrelsens natur.
Pig Latin er et forholdsvis stift sprog, der bruger velkendte nรธgleord fra databehandling, f.eks. Join, Group og Filter. Diagrammet nedenfor tracsender et script fra Grunt-shellen gennem parseren, optimeringsprogrammet og compileren pรฅ sin vej til udfรธrelsesmotoren.
Udfรธrelsestilstande
Pig i Hadoop har to udfรธrelsestilstande, og installationsgennemgangen lรฆngere nede bruger dem begge:
- Lokal tilstand: I denne tilstand kรธrer Hadoop Pig-sproget i en enkelt FMV og bruger det lokale filsystem. Denne tilstand er kun egnet til analyse af smรฅ datasรฆt ved hjรฆlp af Pig i Hadoop.
- MapReduce-tilstand: I denne tilstand oversรฆttes forespรธrgsler skrevet pรฅ Pig Latin til MapReduce-job og kรธres pรฅ en Hadoop-klynge (klyngen kan vรฆre pseudodistribueret eller fuldt distribueret). MapReduce-tilstand med en fuldt distribueret klynge er nyttig til at kรธre Pig pรฅ store datasรฆt.
De to er det klassiske par. Nuvรฆrende udgivelser eksponerer faktisk seks udfรธrelsestyper, eller exectyper, der hver isรฆr er valgt med det samme -x flag, som dokumenteret i Pig 0.18.0 Introduktionsvejledning.
| Exectype | Kommando | Hvor arbejdet foregรฅr |
|---|---|---|
| Lokale | gris -x lokal | En enkelt JVM mod det lokale filsystem |
| Tez lokal | gris -x tez_local | En enkelt JVM, der bruger Tez-kรธrselstiden (eksperimentel) |
| Spark lokale | gris -x spark_local | En enkelt JVM, der bruger Spark kรธrselstid (eksperimentel) |
| KortReducer | gris eller gris -x mapreduce | En Hadoop-klynge med HDFS; dette er standardindstillingen |
| Tez | gris -x tez | En Hadoop-klynge, der kรธrer Tez-motoren |
| Spark | gris -x gnist | A Spark, YARN eller Mesos-klynge med HDFS |
Latinske datatyper for grise og Operatorer
Fรธr man skriver et script, er det en god idรฉ at vide, hvad Pig kan indeholde, og hvad den kan gรธre ved det. Datamodellen er fuldt indlejret, hvilket gรธr det muligt for Pig at lรฆse logfiler og andet lรธst struktureret input, som en relationel tabel ville afvise.
Pig Latin tilbyder to familier af typer:
- Skalรฆre typer:
int,long,float,double,chararray,bytearray,boolean,datetime,bigintegerogbigdecimal. Eksempelskriptet deklarerer senere hver kolonne somchararray. - Komplekse typer: a tupel er et ordnet sรฆt af felter og opfรธrer sig som en rรฆkke; taske er en uordnet samling af tupler og opfรธrer sig som en tabel; a kort er et sรฆt af nรธgle- og vรฆrdipar, hvis nรธgle skal vรฆre en
chararray.
Operatรธrerne har et lille antal opgaver, og en hรฅndfuld af dem fรธrer nรฆsten alle rรธrledninger:
| OperaTor | Hvad gรธr den |
|---|---|
| LรS / OPBEVAR | Lรฆs en relation fra filsystemet og skriv resultatet tilbage |
| FILTER | Behold kun de tupler, der matcher en betingelse |
| FOREACH โฆ GENERรR | Arbejd kolonne for kolonne, og opbyg nye felter |
| GRUPPE / SAMGRUPPE | Gruppรฉr รฉn relation, eller to eller flere relationer, efter en nรธgle |
| JOIN | Kombinรฉr relationer med en indre eller ydre join |
| UNION / SPLIT | Sammenfรธj relationer, eller opdel en i flere |
| SORTER EFTER / TYDELIG / GRรNSE | Sortรฉr, deduplikรฉr og begrรฆns antallet af tupler |
| DUMP / BESKRIV / FORKLAR / ILLUSTRER | Inspicer resultater, skemaer, udfรธrelsesplaner og prรธvekรธrsler |
De fire inspektionsoperatรธrer har ogsรฅ Grunt-genveje, hvilket sparer penge.ping under fejlfinding: \d til DUMP, \de for BESKRIV, \e for FORKLARING og \i til ILLUSTRER.
Forudsรฆtninger
Pig er et klientsidevรฆrktรธj. Det analyserer et script, planlรฆgger arbejdet og sender job, men det tilbyder ikke lagerplads eller en egen klynge, sรฅ der skal fรธrst findes en fungerende Hadoop-installation. Apache-kravlisten er kort.
| Component | Krav | Hvorfor er det nรธdvendigt |
|---|---|---|
| Hadoop | Hadoop 2.x eller 3.x, med HADOOP_HOME eksporteret | Leverer HDFS og udfรธrelsesmotoren. Uden HADOOP_HOME falder Pig 0.18.0 tilbage til en indlejret Hadoop 2.7.3. |
| Java | Java 1.7 eller nyere, med JAVA_HOME sat til installationsroden | Pig og Hadoop-dรฆmonerne er Java programmer |
| Python (Valgfrit) | Python 2.7 | Kun nรธdvendigt til streaming Python brugerdefinerede funktioner |
| Myre (valgfrit) | Myr 1.8 | Kun nรธdvendigt ved opbygning eller rekompilering af Pig fra kildekode |
To praktiske punkter fรธlger med den liste. For det fรธrste, kรธr alt som en Linux-bruger, der allerede har en hjemmemappe i HDFS og tilladelse til at skrive til den; denne vejledning bruger hduser, den konto, der blev oprettet under opsรฆtningen af โโHadoop. For det andet skal du starte klyngen, fรธr du starter Pig i MapReduce-tilstand, da Pig fejler รธjeblikkeligt, hvis NameNode og ResourceManager er nede. Hvis Hadoop ikke er installeret endnu, skal du arbejde dig igennem hvordan man installerer Hadoop fรธrst.
Sรฅdan downloades og installeres Pig
Nu i denne Apache Pig-tutorial lรฆrer vi, hvordan du downloader og installerer Pig:
Fรธr vi starter med selve processen, skal du sรธrge for at have Hadoop installeret. Skift bruger til 'hduser' (id'et der blev brugt under konfigurationen af โโHadoop; du kan skifte til det bruger-id der blev brugt under din egen Hadoop-konfiguration).
Trin 1) Download den seneste stabile udgave af Pig Hadoop fra et af de tilgรฆngelige spejlwebsteder pรฅ
https://pig.apache.org/releases.html
Vรฆlg tar.gz-filen (og ikke src.tar.gz) for at downloade, som vist nedenfor.
Trin 2) Nรฅr downloadingen er fรฆrdig, skal du navigere til den mappe, der indeholder den downloadede tar-fil, og flytte tar-filen til den placering, hvor du vil konfigurere Pig Hadoop. I dette tilfรฆlde flytter vi til /usr/local.
Flyt til den mappe, der skal indeholde Pig Hadoop-filerne.
cd /usr/local
Extracindholdet af tar-filen som nedenfor.
sudo tar -xvf pig-0.12.1.tar.gz
Trin 3) Rediger ~/.bashrc for at tilfรธje Pig-relaterede miljรธvariabler.
ร bn ~/.bashrc-filen i en hvilken som helst teksteditor efter eget valg, og foretag รฆndringerne nedenfor.
export PIG_HOME=<Installation directory of Pig> export PATH=$PIG_HOME/bin:$HADOOP_HOME/bin:$PATH
Trin 4) Opret nu kilde til denne miljรธkonfiguration ved hjรฆlp af kommandoen nedenfor.
. ~/.bashrc
Trin 5) Vi skal rekompilere Pig for at understรธtte Hadoop 2.2.0.
Her er trinene til at gรธre dette.
Gรฅ til Pigs hjemmemappe.
cd $PIG_HOME
Installer Ant.
sudo apt-get install ant
Bemรฆrk: Downloaden starter og vil tage tid afhรฆngigt af din internethastighed.
Genkompilรฉr Pig.
sudo ant clean jar-all -Dhadoopversion=23
Bemรฆrk venligst, at der downloades flere komponenter i denne rekompileringsproces, sรฅ systemet skal vรฆre forbundet til internettet.
Hvis denne proces ogsรฅ sidder fast et sted, og du ikke ser nogen bevรฆgelse i kommandoprompten i mere end 20 minutter, skal du trykke pรฅ Ctrl + c og kรธre den samme kommando igen.
I vores tilfรฆlde tager det 20 minutter.
Dette rekompileringstrin tilhรธrer 0.12.1-รฆraen, hvor de leverede jar-filer blev bygget mod Hadoop 1 og -Dhadoopversion=23 flag skiftede Ant-bygget til Hadoop 0.23 og 2.x-linjen. Apache Pig 0.18.0 leverer binรฆre filer, der allerede kรธrer pรฅ Hadoop 2.7 og nyere samt Hadoop 3, sรฅ i en nuvรฆrende udgivelse kan du normalt udpakke tarballen og springe direkte til testen nedenfor.
Trin 6) Test Pig-installationen ved hjรฆlp af kommandoen
pig -help
Eksempel Pig Script
Nรฅr Pig er installeret, kรธrer resten af โโdenne Apache Pig-vejledning et komplet script. Vi bruger Pig Scripts til at finde antallet af solgte produkter i hvert land.
Input: Vores inputdatasรฆt er en CSV-fil, SalgJan2009.csv.
Trin 1) Start Hadoop.
$HADOOP_HOME/sbin/start-dfs.sh
$HADOOP_HOME/sbin/start-yarn.sh
Trin 2) Pig i Big Data tager en fil fra HDFS i MapReduce-tilstand og gemmer resultaterne tilbage i HDFS.
Kopier filen SalesJan2009.csv (gemt pรฅ det lokale filsystem pรฅ adressen ~/input/SalesJan2009.csv) til HDFS-hjemmemappen (Hadoop Distributed File System).
Her i dette Apache Pig-eksempel er filen i mappen "input". Hvis filen er gemt et andet sted, skal du give den det navn i stedet.
$HADOOP_HOME/bin/hdfs dfs -copyFromLocal ~/input/SalesJan2009.csv /
Kontroller, om filen rent faktisk blev kopieret eller ej.
$HADOOP_HOME/bin/hdfs dfs -ls /
Trin 3) Grisekonfiguration.
Fรธrst skal du navigere til $PIG_HOME/conf og beholde en kopi af den originale egenskabsfil.
cd $PIG_HOME/conf
sudo cp pig.properties pig.properties.original
ร bn pig.properties ved hjรฆlp af en teksteditor efter eget valg, og angiv logfilstien ved hjรฆlp af pig.logfile.
sudo gedit pig.properties
Loggeren vil bruge denne fil til at logge fejl.
Trin 4) Kรธr kommandoen 'pig', som vil starte Pig-kommandoprompten, en interaktiv shell til Pig-forespรธrgsler.
pig
Trin 5) I Grunt-kommandoprompten for Pig skal du udfรธre Pig-kommandoerne nedenfor i rรฆkkefรธlge.
โ A. Indlรฆs filen, der indeholder data.
salesTable = LOAD '/SalesJan2009.csv' USING PigStorage(',') AS (Transaction_date:chararray,Product:chararray,Price:chararray,Payment_Type:chararray,Name:chararray,City:chararray,State:chararray,Country:chararray,Account_Created:chararray,Last_Login:chararray,Latitude:chararray,Longitude:chararray);
Tryk pรฅ Enter efter denne kommando.
โ B. Gruppรฉr data efter feltet Land.
GroupByCountry = GROUP salesTable BY Country;
โ C. For hver tuple i 'GroupByCountry' genereres den resulterende streng af formen Landets navn: Antal solgte produkter.
CountByCountry = FOREACH GroupByCountry GENERATE CONCAT((chararray)$0,CONCAT(':',(chararray)COUNT($1)));
Tryk pรฅ Enter efter denne kommando.
โ D. Gem resultaterne af dataflowet i mappen 'pig_output_sales' pรฅ HDFS.
STORE CountByCountry INTO 'pig_output_sales' USING PigStorage('\t');
Denne kommando vil tage noget tid at udfรธre. Nรฅr den er fรฆrdig, bรธr du se fรธlgende skรฆrm.
Trin 6) Resultatet kan ses via kommandogrรฆnsefladen som
$HADOOP_HOME/bin/hdfs dfs -cat pig_output_sales/part-r-00000
Resultaterne kan ogsรฅ ses via en webgrรฆnseflade.
ร bn http://localhost:50070/ i en webbrowser.
Port 50070 er NameNode-webgrรฆnsefladen pรฅ Hadoop 2. Hadoop 3 flyttede den samme side til port 9870, sรฅ brug den adresse i stedet, hvis din klynge kรธrer Hadoop 3.
Vรฆlg nu 'Gennemse filsystemet' og naviger op til /user/hduser/pig_output_sales.
ร bn part-r-00000 for at lรฆse land- og produkt-antal-parrene, som scriptet producerede.
Apache Pig vs. Hive vs. MapReduce
Gris vurderes sjรฆldent alene. Det sรฆdvanlige spรธrgsmรฅl er, om et job hรธrer hjemme i Gris, i Hive eller i et hรฅndskrevet MapReduce-program, da alle tre ender som job pรฅ den samme klynge.
| Aspect | KortReducer (Java) | Apache gris | Apache Hive |
|---|---|---|---|
| grรฆnseflade | Java API | Pig Latin , et scriptsprog til dataflow | HiveQL, en SQL-dialekt |
| Niveau af mavemusklertraction | Lav | Medium | Hรธj |
| Typisk bruger | Java developer | Dataingeniรธr eller forsker | Analytiker fortrolig med SQL |
| Data der passer | Alt, hรฅndteret manuelt | Struktureret og semistruktureret; skemaet er valgfrit ved indlรฆsning | Strukturerede tabeller registreret i en metastore |
| Code bind | De fleste linjer | Fรฆrre linjer | Fรฆrrest linjer for en forespรธrgsel |
| Kรธrer som | Et MapReduce-job | Kompilerer til MapReduce, Tez eller Spark job | Kompilerer til MapReduce, Tez eller Spark job |
| Bedste ved | Fuld kontrol og brugerdefineret logik | Flertrins ETL-pipelines | Ad hoc-forespรธrgsler og rapportering |
I praksis er opdelingen ligetil. Brug Hive, nรฅr dataene allerede ligner en tabel, og spรธrgsmรฅlet ligner SQL. Brug Pig, nรฅr inputtet er rodet, nรฅr pipelinen er en kรฆde af transformationer snarere end en enkelt forespรธrgsel, eller nรฅr det samme script skal forgrene sig og genforenes. Brug kun MapReduce, nรฅr ingen af โโabs...traction kan udtrykke logikken, fordi linjeantallet vokser hurtigt.
Gris sidder ogsรฅ komfortabelt ved siden af โโresten af โโรธkosystemet. Sqoop og Flume land de rรฅ data, Pig eller Hive former dem, og en scheduler som f.eks. Apache Oozie kรฆder trinnene sammen til en gentagelig pipeline. For et bredere billede af, hvor disse vรฆrktรธjer passer ind, se vejledningen til big data og opsamlingen af big data-vรฆrktรธjerfor et kommercielt ETL-alternativ til hรฅndskrevne manuskripter, se Talent.























