Monday, September 30, 2013

Bir Veri Akış Dili: Pig

Hadoop icin yazilan bazi veri analizleri oldukca cetrefil hale gelebilir. Ilginctir ki SQL bazli veri tabanlari ortaminda tablolar, dosyalar ile ugrasirken, Buyuk Veri / Hadoop devreye girince duz dosyalar (flat file) ortamina geri donduk. Aslinda bu bir bakima iyi oldu, daha daginik, yapisiz (unstructured) veriler ile ugrasiyoruz, ve onlari sonradan analiz etmek icin daha yaratici cozumler bulmamiz gerekiyor. Verinin uzerinde onceden bir sablon koymuyoruz, analiz gerektiginde veriyi o ihtiyaca yonelik olarak okuyoruz. Veri parcali parcali, bir takim duz dosyalar, bir tar.gz dosyasi icindeki birkac, yuzlerce, binlerce bir halde karsimiza cikabiliyor.

Daha once MRJob'tan bahsettik. Bu ortamda bir islemden (job) digerine veri aktarimi kolaydir, her basamakta direk Python icinde kalarak kod yazabilirsiniz, map() icinden yayinladiginiz anahtar degerler mesela, sonraki reduce() basamagina direk Python tipleri olarak aktarilir.

Fakat MRJob'in hala bazi eksikleri var, tum veri akisinizi ayarlamak icin bir arac degil. Diyelim ki elinizde girdi olarak iki dosya var, bu dosyalari birlestireceksiniz (join) sonra sonuc olarak iki dosya ureteceksiniz, bunlarin biri, bir sonraki basamak icin referans olacak, vs. Bu tur isleri idare etmek icin bir veri analiz diline ihtiyac var.

En son surumu Pig 0.12 bu ihtiyaclara cevap veriyor, ayrica, bizim icin en onemli ozelligi Python icin Jython uzerinden degil, artik direk baglanti kurabiliyor olmasi, yani numpy, scipy gibi kutuphaneleri Pig uzerinden kullanmak mumkun olacak. Bu surum hakikaten yeni, duyurusu surada.

Konusma

Apache Pig

Pig musteri tarafinda (client side) isleyen bir programdir. Yani bir Pig script yazdigimizda bu script'i tum Hadoop makinalarina ayri ayri gondermeye gerek yoktur mesela. Pig script'iniz Hadoop kumenize baglanir, ve o kumeye, veri akis kodunuza gore arka planda bazi esle/indirge islemleri islettirir. Pig'i bir nevi derleyici gibi gorebiliriz, Pig kodu yazariz, "derleyince" arka planda EI islemleri uretilir (ve kumeye gonderilir). Demek ki tek bir makinada Pig kurulmus olmasi yeterlidir.

Once baglantidan Pig 0.12 indirin, unzip yapin. Kurulusu hduser altina yapsaniz iyi olur. Sonra su - hduser ile hduser olun ve .bashrc icine PATH sonuna [PIG DIZINI]/bin ekleyin

Kullanmak icin soyle bir veriyi

1950    0    1
1950    22    1
1950    -11    1
1949    111    1
1949    78    1


/tmp/sample.txt icine yazin. Su kodu /tmp/sample.pig icine yazin

records = LOAD '/tmp/sample.txt' AS (year:chararray, temperature:int, quality:int);

filtered_records = FILTER records BY temperature != 9999 AND (quality == 0 OR quality == 1 OR quality == 4 OR quality == 5 OR quality == 9);

grouped_records = GROUP filtered_records BY year;

max_temp = FOREACH grouped_records GENERATE group, MAX(filtered_records.temperature);

DUMP max_temp;


Simdi hduser olun, ve komut satirindan pig -x local /tmp/sample.pig isletin.

(1949,111)
(1950,22)

gibi bir sonuc ekrana basilmali. Ilk Pig script'imiz boyle.

Bir birlestirme yapalim, /tmp/A icine

Joe    2
Hank    4
Ali    0
Eve    3
Hank    2


/tmp/B icine

2    Tie
4    Coat
3    Hat
1    Scarf


Simdi /tmp/join.pig icine

A = LOAD '/tmp/A';
B = LOAD '/tmp/B';

C = JOIN A BY $0, B BY $1;
DUMP C;


Isletelim

pig -x local /tmp/join.pig

Sonuc

(2,Tie,Joe,2)
(2,Tie,Hank,2)
(3,Hat,Eve,3)
(4,Coat,Hank,4)


Kurulus Notlari

Kurulus acisindan en rahati Pig'i hduser altinda kurmak, sonra diger gunluk kullanilan kullanici icindeyken ssh hduser@localhost araciligi ile pig cagrisini hduser'a yaptirmak. Bu sekilde local durumunda ciktilar /home/hduser altina gidecektir. Bu ssh kullanimina bir ornek soyle

$ ssh hduser@localhost "\
export JAVA_HOME=/usr/lib/jvm/java-6-openjdk-amd64; \
/home/hduser/pig-0.12.0/bin/pig -x local \
/home/burak/dizin/filanca.pig \


Tabii ustte pig script'in oldugu dizinin hduser tarafindan erisilebiliyor olmasi lazim, bunu chmod +x ile script'in icinde oldugu dizinleri disariya acarak basarabilirsiniz.

Dizinler

Pig ile store ... into 'filanca' komutlari into'dan sonra gelen isim altinda bir dizin yaratir, ve sonuclar tanidik Hadoop formatinda part-r-.. gibi dosyalardir. Fakat ayni script tekrar isletilirse bu dizinin ustune yazilmaya ugrasilir ve Pig hata verir. Dizinin uzerine yazmak problem degilse, script basinda

fs -rmr filanca

ile bu dizin silinebilir, sonra script'in geri kalani o dizini yeniden yaratacaktir.

Bu yaziya ekler olacak.

No comments: