Upload
hakan-ilter
View
6.275
Download
6
Embed Size (px)
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.
Citation preview
Pig ve Hive ile Veri Analizi
Nisan 2013v1.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 İ[email protected]
twitter: devvericomhttp://tr.linkedin.com/in/hakanilter/
http://devveri.com
Gündem
● Hadoop● MapReduce● Pig● Hive● Karşılaştırma
Hadoop
Veri işleme amaçlı dağıtık uygulamalar yazılmasını sağlayan bir platform ve açık kaynaklı bir Apache projesidir.
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
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
Kimler Kullanıyor?
● yahoo● last.fm● ebay● amazon● facebook● linkedin● twitter● microsoft● oracle● ...
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
Hadoop
● Hadoop Distributed File System (HDFS)● MapReduce
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
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
MapReduce
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));
}
}
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));
}
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;
}
Hmm...
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
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.
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
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;
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
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
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;
Veri Tipleri
● Basit veri tipleri○ int, long, float, double○ bytearray, chararray
● Kompleks veri tipleri○ Map○ Tuple (row)○ Bag (list of tuples)
Ş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;
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)
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;
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();
}
}
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
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.
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
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;
Nasıl Çalıştırılır?
● Konsol üzerinden
○ hive>
● Script olarak
○ hive -f source.sql
○ hive -e 'select * from test'
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, ...>
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
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;
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
...
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);
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
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;
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
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)
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();
}
}
● (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
Sonrası?
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*
DevVeri.com
Sorular?
?
Teşekkürler!