DevVeri.com

Boğulacaksan büyük veride boğul!

Apache Hive

Apache Hive projesi SQL benzeri bir arayüz yardımıyla Hadoop üzerinde Java kullanmadan sorgulama ve analiz işlemlerini yapmak amacıyla Facebook tarafından geliştirilmiş, daha sonrasında Apache’ye devredilmiş açık kaynaklı bir projedir. Özellikle Veri Ambarı (Datawarehouse) uygulamalarını Hadoop kümeleri üzerinde geliştirebilmek için Hive projesi birçok firma tarafından kullanılmaktadır. Hive kurulumuna geçmeden önce Hadoop kurulumunun nasıl yapıldığını buradan inceleyebilirsiniz.

Hive ile Hadoop üzerinde belirli bir formata uygun şekilde bulunan dosyaları, örneğin .csv dosyalarını metadataları girerek tablo gibi tanıtabiliriz. Hive bu metadata bilgisini saklayarak daha sonra çalıştıracağımız SQL benzeri sorguları MapReduce kodlarına çevirerek bu dosyalar üzerinde select, join işlemlerini gerçekleştirir. Bu sayede çok büyük miktarda veriyi SQL gibi Hadoop üzerinde paralel olarak sorgulama şansımız olur.

 

Başlamadan önce örnek için gerekli olan dosyayı buradan indirebilirsiniz. Örnek dosya içerisinde tab ile ayrılmış iki kolon bilgi var. Bu örnek csv dosyasını example isimli bir klasör açıp Hadoop’a atıyoruz:

$ wget "http://devveri.com/wp-content/uploads/2012/09/example.csv"
$ hadoop dfs -mkdir example
$ hadoop dfs -put example.csv example/example.csv
$ hadoop dfs -ls
Found 2 items
drwxr-xr-x   - devveri supergroup          0 2012-09-06 00:43 /user/devveri/example
drwxr-xr-x   - devveri supergroup          0 2012-03-30 07:35 /user/devveri/test.txt

 

Hive kurulumu için Apache’nin sitesinden Hive ile ilgili paketi indirip /usr/java altına açıyoruz:

$ cd /usr/java
$ wget "http://www.eu.apache.org/dist/hive/hive-0.9.0/hive-0.9.0-bin.tar.gz"
$ gzip -dc hive-0.9.0-bin.tar.gz | tar xf -
$ ln -s /usr/java/hive-0.9.0-bin hive

 

Hive’ın bin klasörünü $PATH değişkenimize eklemek için .bash_profile (ya da .bashrc) dosyamıza ekleme yapıyoruz:

HIVE_HOME=/usr/java/hive
PATH=$PATH:$HIVE_HOME/bin

 

Hive kullanırken oluşan metadata bilgisini bulunduğu klasöre yazıyor. Bu sebeple hive_datawarehouse isimli bir klasör oluşturup workspace mantığında her zaman bu klasör içinde çalışmak anlamlı. Bunun için gerekli klasörleri açıyoruz ve ardından hive komutu ile Hive’ı çalıştırıyoruz:

$ mkdir /usr/java/hive_datawarehouse
$ cd /usr/java/hive_datawarehouse
$ hive
WARNING: org.apache.hadoop.metrics.jvm.EventCounter is deprecated. Please use org.apache.hadoop.log.metrics.EventCounter in all the log4j.properties files.
Logging initialized using configuration in jar:file:/usr/java/hive-0.9.0-bin/lib/hive-common-0.9.0.jar!/hive-log4j.properties
Hive history file=/tmp/devveri/hive_job_log_devveri_201209051924_4942732.txt

 

Hive’ı konsol arayüzünden kullanabildiğiniz gibi -e parametresi ile de komut vererek de çalıştırabiliyorsunuz.

Hadoop üzerine attığımız example klasörü içerisindeki verileri CREATE TABLE komutunu kullanarak Hive’a bir tablo olarak tanıtıyoruz. LOCATION parametresi ile ben kendi HDFS adresimi belirttim, burada “hadoop dfs -ls” komutunu çalıştırarak example klasörünün sizdeki adresini öğrenip yazmanız gerekir.

hive> CREATE EXTERNAL TABLE products
          (PRODUCT_ID INT, PRODUCT_NAME STRING)
          ROW FORMAT DELIMITED FIELDS
          TERMINATED BY '\t'
          LINES TERMINATED BY '\n'
          STORED AS TEXTFILE
          LOCATION '/user/devveri/example';
OK
Time taken: 0.232 seconds

 

Bu komut ile bir tablo yaratacağımızı, bu tablonun int ve String tipinde iki kolondan oluştuğu, bu dosyanın tab karakterleri ile ayrıldığı, satırların \n karakteri ile bittiğini ve Hadoop üzerinde /usr/devveri/example klasörü üzerinde bulunduğunu belirtmiş oluyoruz.

products isimli tabloyu oluşturduğumuza göre, bu verileri SELECT komutu ile görebiliriz:

hive> select * from products;
OK
1	Hadoop
2	MongoDB
3	Cassandra
4	Solr
5	ElasticSearch
Time taken: 0.314 seconds

 

Artık daha kompleks sorgulamalar da yapabilecek durumdayız. Örneğin ID değeri 3 olan kaydı çekmek için aşağıdaki gibi bir sorgu yazarsak Hive bizim için bu sorguyu bir MapReduce olarak işleterek sonucu bize getirebilir:

hive> select * from products where PRODUCT_ID=3;
Total MapReduce jobs = 1
Launching Job 1 out of 1
Number of reduce tasks is set to 0 since there's no reduce operator
Starting Job = job_201209051913_0001, Tracking URL = http://localhost:50030/jobdetails.jsp?jobid=job_201209051913_0001
Kill Command = /usr/java/hadoop-1.0.3/libexec/../bin/hadoop job  -Dmapred.job.tracker=localhost:9001 -kill job_201209051913_0001
Hadoop job information for Stage-1: number of mappers: 1; number of reducers: 0
2012-09-05 19:30:57,922 Stage-1 map = 0%,  reduce = 0%
2012-09-05 19:31:03,976 Stage-1 map = 100%,  reduce = 0%, Cumulative CPU 1.11 sec
2012-09-05 19:31:04,988 Stage-1 map = 100%,  reduce = 0%, Cumulative CPU 1.11 sec
2012-09-05 19:31:06,002 Stage-1 map = 100%,  reduce = 0%, Cumulative CPU 1.11 sec
2012-09-05 19:31:07,013 Stage-1 map = 100%,  reduce = 0%, Cumulative CPU 1.11 sec
2012-09-05 19:31:08,024 Stage-1 map = 100%,  reduce = 0%, Cumulative CPU 1.11 sec
2012-09-05 19:31:09,038 Stage-1 map = 100%,  reduce = 0%, Cumulative CPU 1.11 sec
2012-09-05 19:31:10,048 Stage-1 map = 100%,  reduce = 100%, Cumulative CPU 1.11 sec
MapReduce Total cumulative CPU time: 1 seconds 110 msec
Ended Job = job_201209051913_0001
MapReduce Jobs Launched:
Job 0: Map: 1   Cumulative CPU: 1.11 sec   HDFS Read: 260 HDFS Write: 12 SUCCESS
Total MapReduce CPU Time Spent: 1 seconds 110 msec
OK
3	Cassandra
Time taken: 23.417 seconds

 

Hive’ın en büyük avantajı bu SQL benzeri bir arayüze sahip olmak. Ancak zayıf yönü ise üzerinde analiz yapmamız gereken verilerin mutlaka yapılandırılmış (structured) bir yapıda olması gerekliliği. Sorgulamak istediğiniz veriler yapısal değilse Hive ile üzerinde analiz yapabilmek için Hive’ın SerDe arayüzüne uygun bir kod yazmanız gerekiyor. Bunu da başka bir yazıda anlatmayı planlıyoruz.

Hive’ın tüm detaylarına Apache Hive sayfasından ulaşabilirsiniz.

Kaynak:
https://cwiki.apache.org/confluence/display/Hive/GettingStarted
https://cwiki.apache.org/confluence/display/Hive/Tutorial

, ,

3 thoughts on “Apache Hive

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.