Your SlideShare is downloading. ×
Pig ve Hive ile Hadoop üzerinde Veri Analizi
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Pig ve Hive ile Hadoop üzerinde Veri Analizi

5,748
views

Published on

Hadoop üzerinde Map Reduce programları yazmayı kolaylaştıran Pig ve Hive projesi ile ilgili Özgür Yazılım ve Linux Günleri 2013 organizasyonunda yaptığım sunum.

Hadoop üzerinde Map Reduce programları yazmayı kolaylaştıran Pig ve Hive projesi ile ilgili Özgür Yazılım ve Linux Günleri 2013 organizasyonunda yaptığım sunum.

Published in: Technology

0 Comments
4 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
5,748
On Slideshare
0
From Embeds
0
Number of Embeds
6
Actions
Shares
0
Downloads
55
Comments
0
Likes
4
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Pig ve Hive ile Veri Analizi Nisan 2013 v1.2
  • 2. Hakkımda● Marmara Üni. Elektronik● Software Development Supervisor @ Gitti Gidiyor / eBay● 12+ yıl yazılım tecrübesi● Java, C, C++, C#● Linux!● Search, Big Data, NoSQL Hakan İlter hilter@ebay.com twitter: devvericom http://tr.linkedin.com/in/hakanilter/ http://devveri.com
  • 3. Gündem● Hadoop● MapReduce● Pig● Hive● Karşılaştırma
  • 4. HadoopVeri işleme amaçlı dağıtık uygulamalaryazılmasını sağlayan bir platform ve açıkkaynaklı bir Apache projesidir.
  • 5. Nereden Çıktı?● Google!● Dünyada üretilen verilerin %90lık kısmı son 2 yılda toplandı● Dev veri (Big Data) ○ Yapılandırılmış (structured) ■ ürün, kategori, müşteri, fatura, ödeme... ○ Yapılandırılmamış (unstructured) ■ tweet, paylaşım, like, email, click...● %90 yapılandırılmamış veri
  • 6. Hadoop● Esnek ○ Her türlü veriyi saklayıp analizi yapılabilir● Ölçeklenebilir ○ Binlerce düğüm bir araya getirilebilir● Ekonomik ○ Açık kaynaklı, "commodity" donanımda çalışabilir
  • 7. Kimler Kullanıyor?● yahoo● last.fm● ebay● amazon● facebook● linkedin● twitter● microsoft● oracle● ...
  • 8. Gitti Gidiyorda Hadoop● Arama motoru ○ akıllı sıralama ○ ilgili aramalar ○ otomatik tamamlama ○ bunu mu demek istediniz● Kişiselleştirme (web, mobil, email)● Pazarlama (özel kampanyalar)● Segmentasyon● Raporlama
  • 9. Hadoop● Hadoop Distributed File System (HDFS)● MapReduce
  • 10. HDFS● Verinin saklanmasından sorumludur ○ Dağıtık bir dosya sistemidir ○ Birden çok düğümün disklerini birleştirir ○ Veriyi bloklar halinde yedekli olacak şekilde saklar ○ Bu sayede verinin erişilebilirliği ve güvenilirliği sağlanmış olur ○ Rastlantısal erişim yoktur (write once) ○ Büyük ve duraksız (streaming) veri okuma işlemine göre optimize edilmiştir
  • 11. MapReduce● Veriyi işleme yöntemidir ○ Map ve Reduce birer fonksiyondur ○ İşlenecek veriler bağımsız parçalara bölünür ○ Her bir parça paralel olarak Map fonksiyonuna anahtar-değer şeklinde iletilir ○ Map fonksiyonundan çıkan değerler gruplanıp sıralandıktan sonra yine paralel olarak Reduce fonksiyonuna iletilir ○ Sonuç yine HDFS üzerine yazılır ○ Hadoop bu işlerin nasıl yürüyeceğini kontrol eder
  • 12. MapReduce
  • 13. WordCount.java● Map Metodu public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { String line = value.toString().toLowerCase(); StringTokenizer tokenizer = new StringTokenizer(line); while (tokenizer.hasMoreTokens()) { Text word = new Text(tokenizer.nextToken()); context.write(word, new IntWritable(1)); } }
  • 14. WordCount.java● Reduce Metodu public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException { int sum = 0; for (IntWritable value : values) { sum += value.get(); } context.write(key, new IntWritable(sum)); }
  • 15. WordCount.java● Tool Sınıfı Metodu public int run(String[] args) throws Exception { Job job = new Job(); job.setJarByClass(WordCount.class); FileInputFormat.addInputPath(job, new Path(args[0])); FileOutputFormat.setOutputPath(job, new Path(args[1])); job.setMapperClass(WordCountMapper.class); job.setReducerClass(WordCountReducer.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(IntWritable.class); return job.waitForCompletion(true) ? 0 : 1; }
  • 16. Hmm...
  • 17. Java ve MapReduce● Büyük verilerin analizi için uygun fakat; ○ Geliştirmesi zor! ○ Düşük seviyeli (assembly gibi) ○ Hata yapmaya açık ○ Herkes Java geliştirmiyor● Çözüm, daha yüksek seviyeli diller ○ Pig ○ Hive
  • 18. PigApache Pig, Hadoop üzerindeki büyük verileriişlemek için geliştirilmiş, Pig Latin olarakisimlendirilen yüksek seviyeli bir dile sahip veriişleme platformudur.
  • 19. Pig● Hadoop üzerindeki yapılandırılmamış verinin analizini kolaylaştırır ○ Basit dili ve yapısı sayesinde geliştirme süresini kısaltır ○ Esnek veri modeli ve standart dosya formatlarına destek sağlayar (text, binary, sequence, json vs.) ○ SQLden alışık olduğumuz veri işleme ifadelerine benzer ifadeler kullanılır (group by, order by vs.) ○ Pig kodları optimize edilir ■ Örnek: İki farklı gruplama işlemi otomatik olarak birleştirilebilir
  • 20. WordCount.pig-- hdfs://host/users/user/data.txt dosyasini yukleinput = load data.txt as (line);-- TOKENIZE ile her satirdaki verileri kelimelerine ayir-- flatten ile her bir kelimeyi bir satira donusturwords = foreach input generate flatten(TOKENIZE(line)) as word;-- kelimeleri grupla ve saygrpd = group words by word;cntd = foreach grpd generate group, COUNT(words);-- ekrana basdump cntd;
  • 21. Nasıl Çalıştırılır?● Konsol üzerinden ○ grunt>● Script olarak ○ pig -f source.pig● Programatik olarak ○ Java yardımıyla program içerisinden çağırabilir
  • 22. Pig Latin ve SQL● SQL şema tabanlıdır, Pig Latin esnektir● SQL sorgulama dilidir, sonuç odaklıdır, verinin nasıl işleneceği ile ilgilenilmez● Pig Latin verinin işlenmesi ile ilgili kullanıcıya daha fazla kontrol sunar● SQL ile aynı anda bir sorunun cevabı alınabilir. Birden fazla cevap için iç içe sorgular veya geçici tablolar kullanılır● Pig Latin ile seri halinde uzun operasyonlar sırayla gerçekleştirilebilir
  • 23. Pig Latin ve SQL/* SQL ornegi */CREATE TEMP TABLE t1 AS SELECT customer, sum(purchase) AS total_purchasesFROM transactionsGROUP BY customer;SELECT customer, total_purchases, zipcodeFROM t1, customer_profileWHERE t1.customer = customer_profile.customer;-- Pig ornegitxns = load transactions.csv as (customer, purchase);grpd = group txns by customer;totl = foreach grpd generate group, SUM(txns.purchase) as tp;prfl = load customer_profile.csv as (customer, zipcode);rslt = join totl by group, prfl by customer;dump rslt;
  • 24. Veri Tipleri● Basit veri tipleri ○ int, long, float, double ○ bytearray, chararray● Kompleks veri tipleri ○ Map ○ Tuple (row) ○ Bag (list of tuples)
  • 25. Şema Kullanımı● Şema kullanımı zorunlu değildir A = load data; B = filter A by $1 > 100;● Mevcut şemayı destekler ○ Tip kontrolü ve optimizasyonda kullanılır A = load data as (customer:int, purchase:double); B = filter A by purchase > 100;
  • 26. Pig Latin● Veri işlemek için birçok ifadeyi destekler ○ Veri yükleme ve kaydetme (Load, Store, Dump) ○ Filtreleme (Filter, Distinct, Foreach, Sample) ○ Gruplama (Join, Group, Cogroup, Cross) ○ Sıralama (Order, Limit) ○ Ayırma ve birleştirme (Union, Split)
  • 27. Pig Latin● JOIN örneği A1 = load products.csv as (productId, productName); A2 = load companies.csv as (productId, companyName); J = join A1 by productId, A2 BY productId; R = foreach J generate $0, $1, $3;● Parallel özelliği txns = load transactions.csv as (customer, purchase); -- gruplama isleminde 10 reducer kullan grpd = group txns by customer parallel 10;
  • 28. UDF● Java ile kullanıcı tanımlı fonksiyonlar yazılabilir package myudfs; public class UPPER extends EvalFunc<String> { public String exec(Tuple input) throws IOException { if (input == null || input.size() == 0) return null; String str = (String) input.get(0); return str.toUpperCase(); } }
  • 29. UDF● Register edilen jar içerisinden fonksiyonlar çağırılabilir register myudfs.jar; A = load student_data as (name: chararray, age: int, gpa: float); B = foreach A generate myudfs.UPPER(name); dump B;● Loader ve Storage sınıfları da yazılabilir● Piggybank isimli hazır fonksiyonların olduğu bir kütüphane de mevcuttur
  • 30. HiveApache Hive, SQL benzeri bir arayüzyardımıyla Hadoop üzerinde sorgulama ve VeriAmbarı (Datawarehouse) uygulamalarıgeliştirmeyi sağlayan bir projedir.
  • 31. Hive● Hadoop üzerindeki yapılandırılmış verinin yönetilmesini ve sorgulanmasını sağlar ○ Veriler HDFS üzerinde saklanır ○ Saklanan bu veriler tablo olarak tanımlanır ○ Bu tablolar üzerinden SQL benzeri HiveQL ile MapReduce programları yazılabilir ○ Zengin veri tipleri sunar (struct, array, map vs.) ○ Farklı formatta tutulan verileri sorgulayabilir (text, binary, sequence vs) ○ Genişletilebilir (UDF, SerDe) ○ Veri hakkındaki meta bilgisini de yönetir ○ Ölçeklenebilir ve performanslıdır
  • 32. WordCount.hiveql/* docs tablosunu yarat */CREATE TABLE docs (line STRING);/* docs dosyasini docs tablosu icerisine aktar */LOAD DATA INPATH docs OVERWRITE INTO TABLE docs;/* kelimeleri sayarak yeni bir tablo olustur */CREATE TABLE word_counts AS SELECT word, count(1) AS count FROM (SELECT explode(split(line, s)) AS word FROM docs) w GROUP BY word ORDER BY word;
  • 33. Nasıl Çalıştırılır?● Konsol üzerinden ○ hive>● Script olarak ○ hive -f source.sql ○ hive -e select * from test
  • 34. Veri Tipleri● Basit veri tipleri ○ TINYINT, SMALLINT, INT, BIGINT ○ BOOLEAN, FLOAT, DOUBLE ○ STRING, BINARY, TIMESTAMP, DECIMAL● Kompleks veri tipleri ○ ARRAY<data_type> ○ MAP<primitive_type, data_type> ○ STRUCT<col_name : data_type, ...> ○ UNIONTYPE<data_type, data_type, ...>
  • 35. Veri Yapısı● Tablo (Table) ○ Kolonlardan oluşur (int, double, date, string, vs.) ○ Gelişmiş tipleri de destekler (array, struct, map, vs.) ○ Aslında HDFS üzerindeki bir klasöre denk gelir ○ MANAGED tablolar hive.metastore.warehouse.dir ile belirtilen yerde saklanır (/user/hive/warehouse) ○ Tablolar EXTERNAL olarak da tanımlanabilir ○ Gerçek veriler düz dosyalarda (text, binary, sequence) tutulur /user/hive/warehouse/mydb.db/employees
  • 36. Veri Yapısı● Tablo yaratmak CREATE TABLE employees ( name STRING, salary FLOAT, subordinates ARRAY<STRING>, deductions MAP<STRING, FLOAT>, address STRUCT<street:STRING, city:STRING, state:STRING, zip:INT> ) ROW FORMAT DELIMITED FIELDS TERMINATED BY 001 COLLECTION ITEMS TERMINATED BY 002 MAP KEYS TERMINATED BY 003 LINES TERMINATED BY n STORED AS TEXTFILE;
  • 37. Veri Yapısı● Bölünmüş (Partitioned) Tablolar ○ Tablolar belirli kolonlarına göre bölünerek saklanabilir ○ Bölme işlemi daha sonra yapılacak sorgulamalara göre yapılırsa performans sağlanır ○ Bölünmüş tablolar alt klasörler içerisinde saklanır /user/hive/warehouse/mydb.db/employees/country=CA/state=AB /user/hive/warehouse/mydb.db/employees/country=CA/state=BC /user/hive/warehouse/mydb.db/employees/country=US/state=AL /user/hive/warehouse/mydb.db/employees/country=US/state=TX ...
  • 38. Veri Yapısı● Bölünmüş tablo yaratmak CREATE TABLE employees ( name STRING, salary FLOAT, subordinates ARRAY<STRING>, deductions MAP<STRING, FLOAT>, address STRUCT<street:STRING, city:STRING, state:STRING, zip:INT> ) PARTITIONED BY (country STRING, state STRING);
  • 39. Metastore● Veri hakkındaki meta bilgisini de yönetir ○ Tablolar ile ilgili kolonların tipleri ○ HDFS üzerinde dosyaların konumu ○ Partitioning bilgisi ○ SerDe ayarları ○ İstatistik ○ Datanucleus ORM ile geliştirilmiştir, Derby, MySQL ve benzeri RDBMS kullanılabilir
  • 40. Veri Giriş Çıkışı● LOAD DATA komutuyla veri yüklenebilir LOAD DATA [LOCAL] INPATH filepath [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)]● Sorgu sonuçları tablolara kaydedilebilir INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...) [IF NOT EXISTS]] select_statement1 FROM from_statement;● Tablolardaki veriler dışarı aktarılabilir INSERT OVERWRITE [LOCAL] DIRECTORY directory1 select_statement1 FROM from_statement;
  • 41. Sorgular● Standart sorgular SELECT [ALL | DISTINCT] expr, expr, ... FROM table_reference [WHERE where_condition] [GROUP BY col_list] [LIMIT number]● Karmaşık sorgular SELECT table3.col FROM ( SELECT a+b AS col FROM table1 UNION ALL SELECT c+d AS col FROM table2 ) table3
  • 42. Sorgular● JOIN örneği ○ Sadece eşitlik üzerinden bağ kurulabilir ○ LEFT|RIGHT|FULL OUTER JOIN ○ LEFT SEMI JOIN ○ Birden fazla tablo birbirine bağlanabilir SELECT a.val, b.val, c.val FROM a JOIN b ON (a.key = b.key1) JOIN c ON (c.key = b.key1)
  • 43. UDF● Kullanıcılar kendi fonksiyonlarını geliştirebilirler public class UnixtimeToDate extends UDF { public Text evaluate(Text text) { if (text == null) return null; long timestamp = Long.parseLong(text.toString()); return new Text(toDate(timestamp)); } private String toDate(long timestamp) { Date date = new Date (timestamp * 1000); return DateFormat.getInstance(). format(date).toString(); } }
  • 44. SerDe● (Se)rialization/(De)serialization işlemleri için SerDe arayüzünü sağlar CREATE EXTERNAL TABLE IF NOT EXISTS event_data ( event_id int, timestamp string, type string ) ROW FORMAT SERDE org.my.project.CustomDataFileSerDe STORED AS INPUTFORMAT org.my.project.MyInputFormat OUTPUTFORMAT org.my.project.MyInputFormat LOCATION /data/mydata;
  • 45. Sonrası?
  • 46. KarşılaştırmaÖzellik Pig HiveAmaç ETL Veri AmbarıDil Pig Latin SQL*Şema Esnek ZorunluZengin veri tipleri (map vs) Var VarJoin Var VarGenişleyebilme UDF UDFFarklı Dosya Formatları UDF SerDeJDBC/ODBC Yok Var*NoSQL entegrasyonu Var* Var*
  • 47. DevVeri.com
  • 48. Sorular? ?
  • 49. Teşekkürler!

×