1. 程式人生 > >hive與hbase整合

hive與hbase整合

Hive整合HBase原理

Hive與HBase整合的實現是利用兩者本身對外的API介面互相通訊來完成的,其具體工作交由Hive的lib目錄中的hive-hbase-handler-*.jar工具類來實現,通訊原理如下圖所示。


Hive整合HBase後的使用場景:

(一)通過Hive把資料載入到HBase中,資料來源可以是檔案也可以是Hive中的表。

(二)通過整合,讓HBase支援JOIN、GROUP等SQL查詢語法。

(三)通過整合,不僅可完成HBase的資料實時查詢,也可以使用Hive查詢HBase中的資料完成複雜的資料分析。

 Hive整合HBase配置

 1 Hive對映HBase表

// 如果hbase是叢集,需要修改hive-site.xml檔案配置

$ vim hive-site.xml

  1. <property>
  2.   <name>hbase.zookeeper.quorum</name>
  3.   <value>node1,node2,node3</value>
  4. </property>

// 將hbase lib目錄下的所有檔案複製到hive lib目錄中

$ cd app/hive-1.1.0-cdh5.7.1/

$ cp ~/app/hbase-1.2.0-cdh5.7.1/lib/* lib/

// 在hive中建立對映表

$ hive shell

> create table hive_hbase_test(key int,value string) stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' with serdeproperties("hbase.columns.mapping"=":key,cf1:val") tblproperties("hbase.table.name"="hive_hbase_test");

備註:在hive中建立表hive_hbase_test,這個表包括兩個欄位(int型的key和string型的value),對映為hbase中的表hive_hbase_test,key對應hbase的rowkey,value對應hbase的cf1:val列。


// 在hbase中檢視是否存在對映表

$ hbase shell

> list

2 整合後功能測試

// 建立測試資料

$ vim poke.txt

1      zhangsan

2      lisi

3      wangwu


// 在hive中建立一個poke表並載入測試資料

> create table poke(key int,valuestring) row format delimited fields terminated by '\t';

> load data local inpath '/home/developer/poke.txt' overwrite into table poke;

> select * from poke;


// 將hive的poke表中的資料載入到hive_hbase_test表

> insert overwrite table hive_hbase_test select * from poke;

> select * from hive_hbase_test;


// 檢視hbase的hive_hbase_test表中是否有同樣的資料

> scan 'hive_hbase_test'


需要說明以下幾點:

(一)Hive對映表的欄位是HBase表字段的子集。整合之後的Hive表不能被修改。

(二)Hive中的對映表不能直接插入資料,所以需要通過將資料載入到另一張poke表,然後通過查詢poke表將資料載入到對映表。

(三)上述示例是通過建立內部表的方式將Hive表對映到HBase表,HBase表會自動建立,而且Hive表被刪除後HBase表也會自動刪除。

(四)如果HBase表已有資料,可以通過建立Hive外部表的方式將Hive表對映到HBase表,通過HQLHive表實現對HBase表的資料分析。Hive表刪除將不會對HBase表造成影響。建立外部表的方法如下:

> create external table hive_hbase_test(key int,value string) stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' with serdeproperties("hbase.columns.mapping"=":key,cf1:val") tblproperties("hbase.table.name"="hive_hbase_test");