Pig ve Hive ile Hadoop üzerinde Veri Analizi
-
Upload
hakan-ilter -
Category
Technology
-
view
6.270 -
download
6
description
Transcript of Pig ve Hive ile Hadoop üzerinde Veri Analizi
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!