DevVeri.com

Boğulacaksan büyük veride boğul!

Apache Pig

Apache Pig, Hadoop üzerindeki verileri işlemek için geliştilmiş, Pig Latin olarak adlandırılan basit bir dile sahip, açık kaynaklı bir projedir. 2006 yılında Yahoo tarafından geliştirilmeye başlanmıştır.

MapReduce ile yapmak istediğiniz analizleri Pig ile daha kolay geliştirebilirsiniz. Ayrıca geliştirdiğiniz Pig kodları MapReduce programlarına dönüşmeden önce optimize edildiğinden normalden daha performanslı çalışacaktır. Pig’in en büyük özelliği ise, Pig’in içerisinde bulunmayan ancak ihtiyacınız olan fonksiyonaliteyi Java veya Python gibi diller ile yazacağınız sınıflar ile genişletebilmeniz. Bu özellikler sayesinde Pig ile büyük veri analizi yapmak oldukça avantajlı hale geliyor.

Pig yapı itibariyle SQL’e biraz benzese de aslında çalışma yapısı daha farklı, daha ziyade ETL’e benziyor. Pig kodları bir akış olarak sırayla çalışıyor ve bu sayede kodları yazarken verilerin üzerindeki çalışacak işlemleri kafanızda daha kolay canlandırabiliyorsunuz. Bu yapı sebebiyle aslında SQL’den çok daha basit bir yapısı var.

Pig Latin ile farklı formatta verileri yükleyip, bu veriler üzerinde filtreleme, sıralama, grouplama, aritmetik işlemler ve en önemlisi join’ler yapabiliyorsunuz. Yani SQL ile yapabildiğiniz neredeyse herşeyi Pig ile yapabilmeniz mümkün.

Bu yazımızda Pig kurulumu ve genel olarak nasıl çalıştığını örneklerle incelemeye çalışacağız.

Hadoop kurulumu konusunda bilgi almak isterseniz ilgili yazımıza gözatmanızı öneririz. Aslında Pig’in çalışması için Hadoop’un kurulu olması gerekmiyor. Yani “standalone” modunda da veri analizi yapabiliyor. Bu özelliği sayesinde kodları kendi bilgisayarınızda test edip daha sonra büyük veri setleri üzerinde çalışma şansına sahip olmuş oluyorsunuz. Pig’i kurmak için öncelikle Apache sitesinden en güncel sürümü olan 0.10.0 sürümünü indirip /usr/java klasörü içerisine açıyoruz:

cd /usr/java
wget "http://www.eu.apache.org/dist/pig/pig-0.10.0/pig-0.10.0.tar.gz"
gzip -dc pig-0.10.0.tar.gz | tar xf -
ln -s /usr/java/pig-0.10.0 pig

 

Pig’in komutlarına her yerden erişebilmek için $PATH değişkenine Pig’in yolunu eklemek istersek aşağıdaki satırları .bash_profile (ya da .bash_rc) dosyasına ekliyoruz:

PIG_HOME=/usr/java/pig
PATH=$PATH:$PIG_HOME/bin

 

Eğer ortamda JAVA_HOME ayarı yapılmış değilse bin klasörü içerisindeki pig dosyasını açarak içerisine aşağıdaki satırı ekleyerek Java’nın kurulu olduğu yeri gösteriyoruz:

export JAVA_HOME=/usr/java/jdk

 

Başlamadan önce, örnek amacıyla kullanmak için hazırladığımız products.csv ve companies.csv dosyalarını bilgisayarınıza indirip HDFS’e kopyalıyoruz:

wget "http://devveri.com/wp-content/uploads/2012/09/products.csv"
wget "http://devveri.com/wp-content/uploads/2012/09/companies.csv"
hadoop dfs -put products.csv products.csv
hadoop dfs -put companies.csv companies.csv

 

Şimdi ilk örneği çalıştırmak amacıyla pig konsoluna bağlanıyoruz:

$ pig
2012-09-13 21:37:00,788 [main] INFO  org.apache.pig.Main - Apache Pig version 0.10.0 (r1328203) compiled Apr 19 2012, 22:54:12
2012-09-13 21:37:00,789 [main] INFO  org.apache.pig.Main - Logging error messages to: /home/devveri/pig_1347561420784.log
2012-09-13 21:37:00,987 [main] INFO  org.apache.pig.backend.hadoop.executionengine.HExecutionEngine - Connecting to hadoop file system at: hdfs://localhost:9000
2012-09-13 21:37:01,313 [main] INFO  org.apache.pig.backend.hadoop.executionengine.HExecutionEngine - Connecting to map-reduce job tracker at: localhost:9001
grunt>

 

Pig’in çalışma akışını görmek için sadece verileri yükleyip konsola basan basit bir Pig programı yazalım:

grunt> A = LOAD 'products.csv' USING PigStorage();
grunt> B = FOREACH A GENERATE $0 AS id, $1 AS name;
grunt>

 

İlk satırda A değişkenine products.csv dosyası içerisindeki verileri PigStorage ile yükleyeceğimizi belirtiyoruz. PigStorage sınıfı jenerik olarak yazılmış, csv formatındaki verileri yükleyip parçalayabilen bir sınıf. Örnek verimiz tab karakteri ile ayrılmış olduğu için başka bir parametre belirtimiz yok. İkinci satırda ise A verisi içerisinde foreach döngüsüyle dönüyoruz. Buraya kadar olan kısımda henüz yazdığımız kodlar çalışmadılar. DUMP komutu ile kodların çalışmasını ve sonucun ekrana çıkmasını sağlıyoruz:

grunt> DUMP B;
2012-09-13 21:53:44,782 [main] INFO  org.apache.pig.tools.pigstats.ScriptState - Pig features used in the script: UNKNOWN
2012-09-13 21:53:44,978 [main] INFO  org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.MRCompiler - File concatenation threshold: 100 optimistic? false
2012-09-13 21:53:45,000 [main] INFO  org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.MultiQueryOptimizer - MR plan size before optimization: 1
2012-09-13 21:53:45,000 [main] INFO  org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.MultiQueryOptimizer - MR plan size after optimization: 1
2012-09-13 21:53:45,061 [main] INFO  org.apache.pig.tools.pigstats.ScriptState - Pig script settings are added to the job
2012-09-13 21:53:45,077 [main] INFO  org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.JobControlCompiler - mapred.job.reduce.markreset.buffer.percent is not set, set to default 0.3
2012-09-13 21:53:45,081 [main] INFO  org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.JobControlCompiler - creating jar file Job5568052226528160001.jar
2012-09-13 21:53:47,976 [main] INFO  org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.JobControlCompiler - jar file Job5568052226528160001.jar created
2012-09-13 21:53:47,988 [main] INFO  org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.JobControlCompiler - Setting up single store job
2012-09-13 21:53:48,021 [main] INFO  org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.MapReduceLauncher - 1 map-reduce job(s) waiting for submission.
2012-09-13 21:53:48,301 [Thread-8] INFO  org.apache.hadoop.mapreduce.lib.input.FileInputFormat - Total input paths to process : 1
2012-09-13 21:53:48,301 [Thread-8] INFO  org.apache.pig.backend.hadoop.executionengine.util.MapRedUtil - Total input paths to process : 1
2012-09-13 21:53:48,312 [Thread-8] INFO  org.apache.hadoop.util.NativeCodeLoader - Loaded the native-hadoop library
2012-09-13 21:53:48,312 [Thread-8] WARN  org.apache.hadoop.io.compress.snappy.LoadSnappy - Snappy native library not loaded
2012-09-13 21:53:48,315 [Thread-8] INFO  org.apache.pig.backend.hadoop.executionengine.util.MapRedUtil - Total input paths (combined) to process : 1
2012-09-13 21:53:48,522 [main] INFO  org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.MapReduceLauncher - 0% complete
2012-09-13 21:53:49,336 [main] INFO  org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.MapReduceLauncher - HadoopJobId: job_201209132133_0001
2012-09-13 21:53:49,336 [main] INFO  org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.MapReduceLauncher - More information at: http://localhost:50030/jobdetails.jsp?jobid=job_201209132133_0001
2012-09-13 21:54:02,915 [main] INFO  org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.MapReduceLauncher - 50% complete
2012-09-13 21:54:08,991 [main] INFO  org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.MapReduceLauncher - 100% complete
2012-09-13 21:54:08,994 [main] INFO  org.apache.pig.tools.pigstats.SimplePigStats - Script Statistics: 

HadoopVersion	PigVersion	UserId	StartedAt	FinishedAt	Features
1.0.3	0.10.0	haqen	2012-09-13 21:53:45	2012-09-13 21:54:08	UNKNOWN

Success!

Job Stats (time in seconds):
JobId	Maps	Reduces	MaxMapTime	MinMapTIme	AvgMapTime	MaxReduceTime	MinReduceTime	AvgReduceTime	Alias	Feature	Outputs
job_201209132133_0001	1	0	6	6	6	0	0	0	A,B	MAP_ONLY	hdfs://localhost:9000/tmp/temp1747235596/tmp-2132901767,

Input(s):
Successfully read 5 records (418 bytes) from: "hdfs://localhost:9000/user/devveri/products.csv"

Output(s):
Successfully stored 5 records (89 bytes) in: "hdfs://localhost:9000/tmp/temp1747235596/tmp-2132901767"

Counters:
Total records written : 5
Total bytes written : 89
Spillable Memory Manager spill count : 0
Total bags proactively spilled: 0
Total records proactively spilled: 0

Job DAG:
job_201209132133_0001

2012-09-13 21:54:09,008 [main] INFO  org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.MapReduceLauncher - Success!
2012-09-13 21:54:09,021 [main] INFO  org.apache.hadoop.mapreduce.lib.input.FileInputFormat - Total input paths to process : 1
2012-09-13 21:54:09,021 [main] INFO  org.apache.pig.backend.hadoop.executionengine.util.MapRedUtil - Total input paths to process : 1
(1,Hadoop)
(2,MongoDB)
(3,Cassandra)
(4,Solr)
(5,ElasticSearch)
grunt>

 

Pig kodlarını çalıştırmak için konsol kullanmak zorunda değilsiniz, komut satırından da kaydettiğiniz .pig dosyalarını çalıştırabilirsiniz. Sıradaki örnekte companies.csv dosyasını yükleyip içersinde id alanı 3 değerinden büyük olan firmaları bulan kodu test.pig dosyası içerisine yazalım:

A = LOAD 'companies.csv' USING PigStorage() AS (productId:int, productName:chararray);
B = FILTER A BY productId > 3;
C = FOREACH B GENERATE *;
DUMP C;

 

Yazdığımız kodu komut satırından çalıştıralım:

pig -f test.pig

 

Konsolda olduğu gibi loglar yine ekrana dökülerek kod tamamlandığında sonuç konsola basılacaktır:

(4,LucidImagination)
(5,ElasticSearch)

 

Son olarak products.csv ve companies.csv dosyalarını join operasyonuyla birleştirip, sonucu HDFS üzerinde pigresult klasörüne kaydeden bir örnek yapalım:

/* load products */
A1 = LOAD 'products.csv' USING PigStorage() AS (productId:int, productName:chararray);
B1 = FOREACH A1 GENERATE productId, productName;

/* load companies */
A2 = LOAD 'companies.csv' USING PigStorage() AS (productId:int, companyName:chararray);
B2 = FOREACH A2 GENERATE productId, companyName;

/* join */
J = JOIN B1 BY productId, B2 BY productId;
R = FOREACH J GENERATE $0, $1, $3;
STORE R INTO 'pigresult' USING PigStorage();

 

Sonuç:

$ hadoop dfs -cat pigresult/part-r-00000
1	Hadoop	Cloudera
2	MongoDB	10Gen
3	Cassandra	DataStax
4	Solr	LucidImagination
5	ElasticSearch	ElasticSearch

 

Görüldüğü gibi Java ile geliştireceğiniz uygulamalar yapacağı işe göre çok karmaşık kalırken Pig ile MapReduce uygulamaları yazmak çok daha kolay. Pig ile yapabildiğiniz benzer işlemleri Hive projesi ile de yapabiliyorsunuz ancak bana göre Pig çok daha güzel bir yapıya sahip. İlerleyen günlerde Pig ile ilgili daha fazla yazı yazmaya çalışacağız.

Kaynak:
http://pig.apache.org/docs/r0.10.0/start.html

, ,

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.