Değerli KD okuyucuları, günümüz Big Data koşullarını göz önüne aldığımızda teknik olarak nereden başlayacağımızı veya fikir alabileceğimiz konuları içeren üç makale okudunuz. Şu zamana dek yaptığımız tüm uygulamalar Java programlama dili ile yazıldı.
Bu durumda insanların genel kanısı “büyük verileri Java dilinde işleyebiliyoruz.” şeklinde oluyor. Durum böyle değil ancak Java-Python ikilisine hakim olmak her zaman avantaj sağlayacaktır. Çünkü Apache Vakfı’nın ve diğer oluşumların birincil geliştirme dili olarak bu iki dili tercih ettikleri söylenebilir. Peki ben bundan neden bahsettim? Dediğim gibi bu ikili dili Native API’ler olarak kullanıldığı çok sık görülür ancak her zamanda Native boyutta çalışma fırsatımız olmaz ve çözüm ararız.
İşte tam bu noktada bir takım araçlar girer işin içine ki önemli faktör üstlenen Apache Hive bugün konu oluyor.

 

Hive; Hadoop üzerinde bulunan yapılandırılmış veri işlemek için bir veri ambarı altyapısı aracıdır. Hive kullanarak basit ve kolay şekilde sorgulama-analiz işlemlerini yapabilirsiniz ve işin en güzel yanı bu sorgulamaları SQL diline çok yakın bir dil(Hive Query Language, HiveQL, HQL) ile yapıyor olmamız 🙂

 

Hive Akış Diyagramı

Hive Akış Diyagramı

 

İşleyişe baktığımızda Driver segmentinden sonra işlemlerin MapReduce’a çevirildiği görünüyor. Yani Hive yazdığımız SQL kodlarını MapReduce algoritmasına çeviriyor. Yazının da ilk başında belirttiğim gibi Native olmayan bu araç oldukça güzel imkanlarla dolu.
Her ne kadar SQL diline yakın bir dil kullansada, SQL veritabanlarından veya ilişkisel veritabanı modellerinden çok uzakta bir dünya. Buraya biraz açıklık getirecek olursak Hive veri ambarı modeline benzediği için içerisinde farklı veri kaynakları vardır ve içerisinde direkt “database” ismi ile kullanılırlar. Bu yüzden sorgulamalar veritabanları üzerinden yapılır, kendisi bir veritabanı sistemi değildir. Gerçek zamanlı sorgulamalar ve transactionlar(OLTP) için doğru bir seçim değildir. Bunun yerine OLAP bağlantıları daha uygundur.

 

Hive Nelerden Oluşur?

  • Kullanıcı arayüzü: Hive Web arayüzü, komut satırı ve Hive HD gibi komut yürütme işlemlerinin sürdürülebileceği bir alana sahiptir.
  • Meta Store: Hive içerisinde ki veritabanı yapılarının, kolonların ve diğer özel tip olarak adlandırılabilecek bilgileri saklar
  • HiveQL: Hive Query Language SQL sorgulama diline çok benzer bir yapıya sahiptir. Sorgulamalar bu dil ile yapılır.
  • Çalıştırıcı: HiveQL dilinde yazan sorguları MapReduce programına çevirerek çalıştırır.
  • HDFS / HBase: Tüm bu işlemlerin döndüğü kaynak olarak kullanılan birimdir. (HBase daha sonra anlatacağım konular arasında)

 

Hive Nasıl Çalışır?

  • 1) Sorguyu Çalıştır: Kullanıcı arayüzünden sorgu girilir ve çalıştırılır.
  • 2) Plan Alımı: Girilen sorgunun gereksinimlerini ayrıştırır ve herhangi bir yazım hatası olup olmadığı kontrol edilir.
  • 3) Meta Alma: Derleyici meta bilgilerinin talebini Metastore’a iletir.
  • 4) Meta Gönderme: Metastore meta bilgilerini derleyiciye gönderir.
  • 5) Plan Gönderimi: Derleyici tüm gereksinimleri yeniden kontrol ettikten sonra planı geri iletir. Buraya kadar olan bölümde sorgunun ayrışması ve planlanması tamamlanmış olur.
  • 6) Planı Çalıştır: Plan çalıştırılmak üzere çalıştırıcıya gönderilir.
  • 7) İşi Çalıştır: Çalıştırıcı devraldığı HQL sorgularını MapReduce programına çevirir ve çalıştırır. Aynı zamanda çalıştırıcı meta bilgileri ile ilgili işlemleri gerçekleştirebilir.
  • 8) Sonucu Getir: Çalıştırıcı sonuçları getirir.
  • 9) Sonucu Gönder: Çalıştırıcı sonuçları talebe iletir ve kullanıcı arayüzünde görüntülenir.

 

Basit bir senaryo ile şimdi bir örnek işleyelim. Yine aynı veriseti (Newyork Stock Exchange) üzerinden gerçekleştireceğiz. Şimdi Hive tarafında bir veritabanına ihtiyacımız var. Komut satırından basit bir create işlemi yeterli.

create database nyse;

Ardından verileri yükleyeceğimiz bir tablo oluşturmamız gerekiyor. Hive konsoluna bağlandıktan sonra NYSE verisetine uygun alanları tanımlayarak tablomuzu biçimlendirmemiz gerek.

create table stock(id int, stock_symbol string, stock_date date, price_open double, 
price_high double, price_low double, price_close double, stock_volume
int, price_adj_close double) row format delimited fields terminated by ',' stored 
as textfile;

Hive’in bir Hadoop parçası olduğunu düşünürsek verilerimizin HDFS üzerinde bulunması gerekiyor. Bu nedenle gerekli veri kaynaklarını HDFS üzerinde yayınlayacağız.

hadoop dfs -put data.csv /user/hive/warehouse

HDFS içerisinde ki dosyayı tabloya gömebilmek için Hive’in komutlarını kullanalım.

load data inpath '/user/hive/warehouse/data.csv' overwrite into table stock;

Eğer herhangi bir hata ile karşılaşmadıysak verilerimiz aktarılmış demektir. Hemen bir kaç deneme ile sonuca ulaşabiliriz.

select * from stock limit 10;
OK
2       ASP     2001-12-31      12.55   12.8    12.42   12.8    11300   6.91
3       ASP     2001-12-27      12.59   12.59   12.52   12.57   5400    6.79
5       ASP     2001-12-24      12.61   12.61   12.61   12.61   1400    6.76
7       ASP     2001-12-21      12.4    12.78   12.4    12.6    18200   6.75
8       ASP     2001-12-19      12.42   12.68   12.35   12.6    10100   6.75
10      ASP     2001-12-17      12.47   12.52   12.47   12.52   80000   6.71
Time taken: 1.902 seconds, Fetched: 10 row(s)

select count(*) from stock;
Query ID = root_20160626072513_c5b50ef3-739c-4458-825d-bfe8a6ebb88c
Total jobs = 1
Launching Job 1 out of 1
Number of reduce tasks determined at compile time: 1
In order to change the average load for a reducer (in bytes):
  set hive.exec.reducers.bytes.per.reducer=<number>
In order to limit the maximum number of reducers:
  set hive.exec.reducers.max=<number>
In order to set a constant number of reducers:
  set mapreduce.job.reduces=<number>
Starting Job = job_1466938594086_0001, Tracking URL = http://41c1fbbd49ba:8088/p
roxy/application_1466938594086_0001/
Kill Command = /usr/local/hadoop/bin/hadoop job  -kill job_1466938594086_0001
Hadoop job information for Stage-1: number of mappers: 1; number of reducers: 1
2016-06-26 07:26:02,492 Stage-1 map = 0%,  reduce = 0%
2016-06-26 07:26:37,273 Stage-1 map = 100%,  reduce = 0%, Cumulative CPU 8.82 se
c
2016-06-26 07:27:07,630 Stage-1 map = 100%,  reduce = 67%, Cumulative CPU 12.85
sec
2016-06-26 07:27:10,135 Stage-1 map = 100%,  reduce = 100%, Cumulative CPU 14.2
sec
MapReduce Total cumulative CPU time: 14 seconds 200 msec
Ended Job = job_1466938594086_0001
MapReduce Jobs Launched:
Stage-Stage-1: Map: 1  Reduce: 1   Cumulative CPU: 14.2 sec   HDFS Read: 4552826
7 HDFS Write: 7 SUCCESS
Total MapReduce CPU Time Spent: 14 seconds 200 msec
OK
812989
Time taken: 118.176 seconds, Fetched: 1 row(s)

Görebileceğimiz üzere Hive bizim için MapReduce işlemini güzelce yapıyor 🙂

Bir sonraki makalede görüşmek üzere

Facebook'dan yorumla