Apache Pig

Interesantno ime, moćan alat, skriptni jezik… Ovo su neke od reči koje opisuju Apache Pig, još jedan popularan deo Hadoop ekosistema. Ovaj alat je posebno interesantan programerima, a i analitičarima. Prvi put kada sam čuo za Pig, nisam obraćao puno pažnje, ali tokom rada sam uvideo da je ovo jedan odličan dodatak koji vam štedi vreme i jako je moćan.

Šta je Apache Pig?

Apache Pig je platforma za pisanje MapReduce programa. Jezik koji se koristi pri pisanju ovih programa se naziva Pig Latin. Tehnički gledano, Pig je platforma, a Pig Latin je programski jezik (obično se kaže samo Pig i pritom misli na Pig kao programski jezik). Ovaj programski jezik malo liči i na SQL, ali postoje suštinske razlike o kojima ću pisati u nastavku teksta. Originalno Pig je razvijen u Yahoo-u, ali je postao deo Apache fondacije, sada je otvoren za javnost i besplatan je. Iz ličnog iskustva mogu reći da je Pig lak za učenje, na Internetu postoji dosta materijala i primera. Jedna odlična mogućnost koja krasi ovaj alat je nadogradnja, odnosno moguće je pisati dodatne funkcije koje ne postoje u samom porgramu. Za pisanje tih funkcija moguće je koristiti Javu, Python, JavaScript, Ruby ili Groovy. Nešto što se meni posebno svidelo je to da je optimizacija automatska i da se ja, kao korisnik ovog alata, mogu fokusirati više na pisanje koda, nego da brinem o efikasnosti izvršavanja istog.

Čemu služi?

Pig Latin podržava transformaciju podataka uz pomoć agregacije, JOIN-a, SORT-a. Najbitnija namena Pig-a je pisanje MapReduce koda na jednostavan način. Na sajtu Hortonworks-a našao sam odličan tekst o tome kada se koristi Pig, koji kaže da je ovaj alat namenjen prvenstveno za tri Big Data posla:

  • ETL(extract-transform-load) poslove,
  • rad nad sirovim podacima i
  • iterativno procesiranje podataka.
Pig Word Count

Pig Word Count

Do sada, koliko sam mogao da koristim Pig, a da to nije samo testiranje ovog alata, najčešće sam koristio za rad nad sirovim podacima. Posebno je dobro koristiti Pig ako radite sa nekim tekstom, odnosno sa podacima koje je teško struktuirati u vidu tabele pomoću HCatalog-a. Najbolji primer koji sam imao u skorije vreme je da sam pomoću Flume-a, o kojem ću pisati u nekom od narednih tekstova, povukao podatke sa Twitter streaming-a. Podataka je bilo previše u tom smislu da nije imalo smisla da se od njih napravi tabela  direktno iz sirovog oblika. Postoji dosta primera na Internetu kako se piše brojanje reči, iz tog razloga neću to ovde navoditi kao primer. Probajte da nađete taj primer napisan u Pig-u i u Javi, čisto da vidite koliko je moćan i jednostavan. U jednoj knjizi o Pig-u sam pročitao nešto o tome zašto se zove baš tako i objašnjenje je glasilo – “jede sve, živi svuda”. To bi značilo da ovaj alat može da radi sa bilo kojim tipovima podataka, bili oni struktuirani ili ne. Naravno, neko moje iskustvo govori da nije uvek najbolje rešenje koristiti Pig, ali to zavisi od slučaja do slučaja. Ako se pitate kako odrediti kada koristiti, a kada ne ovaj alat, moj savet je da probate na nekim manjim primerima razne situacije i tako ćete najbolje shvatiti. Lično mi je najjasnije bilo tek kada sam probao.

Kako Pig radi.  

Pig je napravljen tako da apstrahuje MapReduce kod napisan u Javi. Da pojasnim ovo: ako napišete kod u Pig-u, on će se prvo prevesti u Javu, pa će se zatim izvršiti. Za razliku od SQL-a koji je deklerativni programski jezik, Pig je data flow jezik, što znači da program koji se piše definiše kako će se transformisati podaci. Skripte napisane u ovom jeziku mogu da budu grafovi, što znači da je moguće pisati složene transformacije, imati više ulaza i više izlaza. Jako je bitno da napomenem da Pig može da radi u dva stanja, lokalno i MapReduce stanje. Prvo znači da Pig pristupa samo jednoj mašini i sve se nalazi na njoj, za razliku od MapReduce stanja koje je podrazumevano i znači da se pristupa podacima iz Hadoop klastera distributivno. Lično nisam probao lokalno da radim u Pig-u, tako da ne znam ništa detaljnije o tome.

Pig radi sa relacijama, koje imaju malo drugačije značenje nego relacije u relacionom modelu. Relacija u Pig-u je bag ili vreća, a ta vreća se sastoji od tuples-a. Ako bismo napravili poređenje sa tabelama u relacionom modelu, tuples su redovi. Glavna razlika je da bag nije tabela, jer tuples ne moraju da budu sortirani, ne moraju da budu istog tipa  u istoj koloni, takođe tuples ne moraju biti istih veličina. Bitno je napomenuti da Pig podržava i sve poznate tipove podataka kao što su int, long… i u ovom slučaju složeni tipovi su tuple, bag i map.
Apache Pig je jako složena platforma i nije moguće opisati sve u jednom tekstu. Primere sam za sada izostavio, jer sam želeo da krenem sa uvodom. Možda je jedna od mojih grešaka to što sam baš i počeo sa primerima, a da nisam ni shvatao šta je i kada se koristi ovaj alat. Sve u svemu, jako koristan alat i preporučujem da probate. Sa Hortonworks sajta je moguće skinuti Sandbox VM sa Hadoop-om i sve ovo probati. Nadam se da ću uskoro napišati još jedan tekst o ovom alatu ili ako je neko koristio, neka se javi da podeli iskustva. Spremite se da nastavimo da hadupujemo zajedno!