Pig ve Hive ile Hadoop üzerinde Veri Analizi

49
Pig ve Hive ile Veri Analizi Nisan 2013 v1.2

description

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.

Transcript of Pig ve Hive ile Hadoop üzerinde Veri Analizi

Page 1: Pig ve Hive ile Hadoop üzerinde Veri Analizi

Pig ve Hive ile Veri Analizi

Nisan 2013v1.2

Page 2: Pig ve Hive ile Hadoop üzerinde Veri Analizi

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 İ[email protected]

twitter: devvericomhttp://tr.linkedin.com/in/hakanilter/

http://devveri.com

Page 3: Pig ve Hive ile Hadoop üzerinde Veri Analizi

Gündem

● Hadoop● MapReduce● Pig● Hive● Karşılaştırma

Page 4: Pig ve Hive ile Hadoop üzerinde Veri Analizi

Hadoop

Veri işleme amaçlı dağıtık uygulamalar yazılmasını sağlayan bir platform ve açık kaynaklı bir Apache projesidir.

Page 5: Pig ve Hive ile Hadoop üzerinde Veri Analizi

Nereden Çıktı?

● Google!● Dünyada üretilen verilerin %90'lı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

Page 6: Pig ve Hive ile Hadoop üzerinde Veri Analizi

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

Page 7: Pig ve Hive ile Hadoop üzerinde Veri Analizi

Kimler Kullanıyor?

● yahoo● last.fm● ebay● amazon● facebook● linkedin● twitter● microsoft● oracle● ...

Page 8: Pig ve Hive ile Hadoop üzerinde Veri Analizi

Gitti Gidiyor'da 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

Page 9: Pig ve Hive ile Hadoop üzerinde Veri Analizi

Hadoop

● Hadoop Distributed File System (HDFS)● MapReduce

Page 10: Pig ve Hive ile Hadoop üzerinde Veri Analizi

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

Page 11: Pig ve Hive ile Hadoop üzerinde Veri Analizi

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

Page 12: Pig ve Hive ile Hadoop üzerinde Veri Analizi

MapReduce

Page 13: Pig ve Hive ile Hadoop üzerinde Veri Analizi

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));

}

}

Page 14: Pig ve Hive ile Hadoop üzerinde Veri Analizi

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));

}

Page 15: Pig ve Hive ile Hadoop üzerinde Veri Analizi

WordCount.java

● Tool Sınıfı Metodupublic 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;

}

Page 16: Pig ve Hive ile Hadoop üzerinde Veri Analizi

Hmm...

Page 17: Pig ve Hive ile Hadoop üzerinde Veri Analizi

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

Page 18: Pig ve Hive ile Hadoop üzerinde Veri Analizi

Pig

Apache Pig, Hadoop üzerindeki büyük verileri işlemek için geliştirilmiş, Pig Latin olarak isimlendirilen yüksek seviyeli bir dile sahip veri işleme platformudur.

Page 19: Pig ve Hive ile Hadoop üzerinde Veri Analizi

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.)○ SQL'den 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

Page 20: Pig ve Hive ile Hadoop üzerinde Veri Analizi

WordCount.pig-- hdfs://host/users/user/data.txt dosyasini yukle

input = load 'data.txt' as (line);

-- TOKENIZE ile her satirdaki verileri kelimelerine ayir

-- flatten ile her bir kelimeyi bir satira donustur

words = foreach input generate flatten(TOKENIZE(line)) as word;

-- kelimeleri grupla ve say

grpd = group words by word;

cntd = foreach grpd generate group, COUNT(words);

-- ekrana bas

dump cntd;

Page 21: Pig ve Hive ile Hadoop üzerinde Veri Analizi

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

Page 22: Pig ve Hive ile Hadoop üzerinde Veri Analizi

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

Page 23: Pig ve Hive ile Hadoop üzerinde Veri Analizi

Pig Latin ve SQL/* SQL ornegi */

CREATE TEMP TABLE t1 AS

SELECT customer, sum(purchase) AS total_purchases

FROM transactions

GROUP BY customer;

SELECT customer, total_purchases, zipcode

FROM t1, customer_profile

WHERE t1.customer = customer_profile.customer;

-- Pig ornegi

txns = 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;

Page 24: Pig ve Hive ile Hadoop üzerinde Veri Analizi

Veri Tipleri

● Basit veri tipleri○ int, long, float, double○ bytearray, chararray

● Kompleks veri tipleri○ Map○ Tuple (row)○ Bag (list of tuples)

Page 25: Pig ve Hive ile Hadoop üzerinde Veri Analizi

Şema Kullanımı

● Şema kullanımı zorunlu değildirA = 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;

Page 26: Pig ve Hive ile Hadoop üzerinde Veri Analizi

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)

Page 27: Pig ve Hive ile Hadoop üzerinde Veri Analizi

Pig Latin

● JOIN örneğiA1 = 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ğitxns = load 'transactions.csv' as (customer, purchase);

-- gruplama isleminde 10 reducer kullan

grpd = group txns by customer parallel 10;

Page 28: Pig ve Hive ile Hadoop üzerinde Veri Analizi

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();

}

}

Page 29: Pig ve Hive ile Hadoop üzerinde Veri Analizi

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

Page 30: Pig ve Hive ile Hadoop üzerinde Veri Analizi

Hive

Apache Hive, SQL benzeri bir arayüz yardımıyla Hadoop üzerinde sorgulama ve Veri Ambarı (Datawarehouse) uygulamaları geliştirmeyi sağlayan bir projedir.

Page 31: Pig ve Hive ile Hadoop üzerinde Veri Analizi

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

Page 32: Pig ve Hive ile Hadoop üzerinde Veri Analizi

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;

Page 33: Pig ve Hive ile Hadoop üzerinde Veri Analizi

Nasıl Çalıştırılır?

● Konsol üzerinden

○ hive>

● Script olarak

○ hive -f source.sql

○ hive -e 'select * from test'

Page 34: Pig ve Hive ile Hadoop üzerinde Veri Analizi

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, ...>

Page 35: Pig ve Hive ile Hadoop üzerinde Veri Analizi

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

Page 36: Pig ve Hive ile Hadoop üzerinde Veri Analizi

Veri Yapısı

● Tablo yaratmakCREATE 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;

Page 37: Pig ve Hive ile Hadoop üzerinde Veri Analizi

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

...

Page 38: Pig ve Hive ile Hadoop üzerinde Veri Analizi

Veri Yapısı

● Bölünmüş tablo yaratmakCREATE 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);

Page 39: Pig ve Hive ile Hadoop üzerinde Veri Analizi

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

Page 40: Pig ve Hive ile Hadoop üzerinde Veri Analizi

Veri Giriş Çıkışı

● LOAD DATA komutuyla veri yüklenebilirLOAD DATA [LOCAL] INPATH 'filepath'

[OVERWRITE] INTO TABLE tablename

[PARTITION (partcol1=val1, partcol2=val2 ...)]

● Sorgu sonuçları tablolara kaydedilebilirINSERT OVERWRITE TABLE tablename1

[PARTITION (partcol1=val1, partcol2=val2 ...)

[IF NOT EXISTS]] select_statement1 FROM from_statement;

● Tablolardaki veriler dışarı aktarılabilirINSERT OVERWRITE [LOCAL] DIRECTORY 'directory1'

select_statement1 FROM from_statement;

Page 41: Pig ve Hive ile Hadoop üzerinde Veri Analizi

Sorgular

● Standart sorgularSELECT [ALL | DISTINCT] expr, expr, ...

FROM table_reference

[WHERE where_condition]

[GROUP BY col_list]

[LIMIT number]

● Karmaşık sorgularSELECT table3.col

FROM (

SELECT a+b AS col FROM table1

UNION ALL

SELECT c+d AS col FROM table2

) table3

Page 42: Pig ve Hive ile Hadoop üzerinde Veri Analizi

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)

Page 43: Pig ve Hive ile Hadoop üzerinde Veri Analizi

UDF

● Kullanıcılar kendi fonksiyonlarını geliştirebilirlerpublic 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();

}

}

Page 44: Pig ve Hive ile Hadoop üzerinde Veri Analizi

● (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';

SerDe

Page 45: Pig ve Hive ile Hadoop üzerinde Veri Analizi

Sonrası?

Page 46: Pig ve Hive ile Hadoop üzerinde Veri Analizi

Karşılaştırma

Özellik Pig Hive

Amaç ETL Veri Ambarı

Dil Pig Latin SQL*

Şema Esnek Zorunlu

Zengin veri tipleri (map vs) Var Var

Join Var Var

Genişleyebilme UDF UDF

Farklı Dosya Formatları UDF SerDe

JDBC/ODBC Yok Var*

NoSQL entegrasyonu Var* Var*

Page 47: Pig ve Hive ile Hadoop üzerinde Veri Analizi

DevVeri.com

Page 48: Pig ve Hive ile Hadoop üzerinde Veri Analizi

Sorular?

?

Page 49: Pig ve Hive ile Hadoop üzerinde Veri Analizi

Teşekkürler!