Hive ile HBase Entegrasyonu
Hadoop ekosistemindeki projelerin en büyük avantajlardan birisi de birbirleriyle uyumlu olarak çalışabilmeleri. Bu yazımızda HBase üzerindeki verileri Hive üzerinden sorgulamayı inceleyeceğiz.
HBase ile Hive’ı entegre edebilmek için ilk adım olarak gerekli kütüphanelerin classpath üzerinden erişilebilir olmasını sağlamak. Aşağıdaki jar dosyalarını (tabii ki uygun versiyon numaraları ile) Hive’ın ya da direkt olarak Hadoop’un lib dizini içerisine bulunması gerekiyor:
hive-hbase-handler-0.9.0.jar hbase-0.92.0.jar zookeeper-3.3.4.jar guava-r09.jar
Örnek olması açısından HBase tarafında bir tablo yaratmak amacıyla Sqoop kullanabiliriz. Veritabanımızda bulunan mevcut bir tabloyu HBase’e Sqoop üzerinden aktarıyoruz:
sqoop import --driver com.mysql.jdbc.Driver --connect "jdbc:mysql://myhost/test" --username myuser --password mypass --table mytable --hbase-table mytable --column-family c --hbase-create-table
Sqoop parametrelerinde –hbase-create-table ile verileri HBase’e aktaracağımızı, –hbase-table ile de HBase tarafındaki tablo ismini belirtiyoruz. Komutun çalışması sona erdikten sonra HBase shell üzerinden verileri kontrol edebiliriz:
$ hbase shell HBase Shell; enter 'help' for list of supported commands. Type "exit" to leave the HBase Shell Version 0.94.6-cdh4.5.0, rUnknown, Wed Nov 20 15:46:19 PST 2013 hbase(main):001:0>scan 'mytest', {LIMIT=>1} ROW COLUMN+CELL 1 column=c:field1, timestamp=1392992550443, value=val1 1 column=c:field2, timestamp=1392992550443, value=test1 1 row(s) in 0.1050 seconds
Daha sonrasında Hive tarafında HBase’deki tablomuzu external table olarak tanımlıyoruz:
CREATE EXTERNAL TABLE mytest(rowkey STRING, field1 STRING, field2 STRING) STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' WITH SERDEPROPERTIES ('hbase.columns.mapping' = ':key,c:field1,c:field2') TBLPROPERTIES ('hbase.table.name' = 'mytest');
Tanımı yaparken HBaseStorageHandler sınıfını kullanıyoruz. Tabloyu yaratırken verdiğimiz kolon tanımları ile SerDe tanımlarının birebir örtüşmesi gerekiyor. Yani :key ile HBase tarafındaki rowkey değerini rowkey alanı ile, c:field1 alanını da field1 alanı ile örtüştürüyoruz. hbase.table.name parametresi ile de HBase tarafındaki tablo ismini belirtiyoruz.
Tanımı yaptıktan sonra artık Hive tarafında sorgulama yapabilir hale geliyoruz:
hive> SELECT * FROM mytest limit 3; OK 1 val1 test1 2 val2 test2 3 val3 test3
Her ne kadar HBase üzerindeki verileri Hive ile sorgulamak kulağa çok hoş gelse de bu entegrasyon halen geliştirme aşamasında. Yaptığım denemelerde çok verimli sonuç aldığımı malesef söyleyemeyeceğim. Sorgular ya çok uzun sürüyor ya da bir noktada başarısız oluyor. Ancak geliştirmeler tamamlandığında oldukça kullanışlı olacağını tahmin ediyorum.
Daha detaylı bilgi için ilgili sayfayı ziyaret edebilirsiniz.
Hive JDBC Bağlantısı Büyük Veri, Veri Bilimi ve Ontoloji