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