1. 程式人生 > >Hive整合HBase 通過Hive讀/寫HBase中的表

Hive整合HBase 通過Hive讀/寫HBase中的表

寫在前面一:

本文將Hive與HBase整合在一起,使Hive可以讀取HBase中的資料,讓Hadoop生態系統中最為常用的兩大框架互相結合,相得益彰。

寫在前面二:

使用軟體說明


約定所有軟體的存放目錄:

/home/yujianxin

一、Hive整合HBase原理

Hive與HBase整合的實現是利用兩者本身對外的API介面互相進行通訊,相互通訊主要是依靠hive-hbase-handler-0.9.0.jar工具類,如下圖

Hive與HBase通訊示意圖

二、具體步驟

安裝前說明

1、關於Hadoop、HBase、Hive叢集的搭建,請參考本人博文“基於Hadoop的資料分析綜合管理平臺之Hadoop、HBase完全分散式叢集搭建”

2、本文中Hadoop、HBase、Hive安裝路徑

2.1、拷貝jar包
刪除$HIVE_HOME/lib/下HBase、Zookeeper相關jar

rm -rf $HIVE_HOME/lib/zookeeper-*.jar
rm -rf $HIVE_HOME/lib/hbase*.jar
重新拷貝
cp $HBASE_HOME/hbase-0.94.7-security.jar $HIVE_HOME/lib/ 
cp $HBASE_HOME/lib/zookeeper-3.4.5.jar $HIVE_HOME/lib/
2.2、修改$HIVE_HOME/conf/hive-site.xml
mkdir $HIVE_HOME/logs
在尾部新增
<property>
<name>hive.querylog.location</name>
<value>/home/yujianxin/hive/hive-0.9.0/logs</value>
</property>
<property>
<name>hive.aux.jars.path</name>
<value>
file:///home/yujianxin/hive/hive-0.9.0/lib/hive-hbase-handler-0.9.0.jar,
file:///home/yujianxin/hive/hive-0.9.0/lib/hbase-0.94.7-security.jar,
file:///home/yujianxin/hive/hive-0.9.0/lib/zookeeper-3.4.5.jar	
</value>
</property>
修改
<property>
  <name>hive.zookeeper.quorum</name>
  <value>master,slave1,slave2</value>
</property>
2.3、拷貝hbase-0.94.7-security.jar到所有hadoop節點(包括master)的hadoop/lib下
cp $HBASE_HOME/hbase-0.94.7-security.jar $HADOOP_HOME/lib
2.4、拷貝hbase/conf下的hbase-site.xml檔案到所有hadoop節點(包括master)的hadoop/conf下

cp $HBASE_HOME/conf/hbase-site.xml  $HADOOP_HOME/conf

三、啟動、使用配置後Hive,測試是否配置成功

3.1、啟動Hive

叢集方式啟動

hive --auxpath /home/yujianxin/hive/hive-0.9.0/lib/hive-hbase-handler-0.9.0.jar,/home/
yujianxin/hive/hive-0.9.0/lib/hbase-0.94.7-security.jar,/home/yujianxin/hive/hive-0.9.
0/lib/zookeeper-3.4.5.jar

可以將此啟動Hive與HBase整合的命令寫成Shell指令碼,設定成開機啟動

3.2、在Hive中建立HBase識別的表

CREATE TABLE hbase_hive_1(key int, value string) 
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' 
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,cf1:val") 
TBLPROPERTIES ("hbase.table.name" = "xyz");

hbase.table.name 定義在hbase中的table名稱

多列時,data:1,data:2
多列族時,data1:1,data2:1
hbase.columns.mapping 定義在hbase的列族,裡面的:key 是固定值而且要保證在表pokes中的foo欄位是唯一值

建立有分割槽的表

CREATE TABLE hbase_hive_2(key int, value string)  
partitioned by (day string) 
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' 
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,cf1:val") 
TBLPROPERTIES ("hbase.table.name" = "xyz2");

分別檢視Hive、HBase中建立的表

3.3、匯入資料

新建hive的資料表

create table pokes(foo int,bar string)
row format delimited fields terminated by ',';
批量匯入資料


load data local inpath '/home/yujianxin/temp/data1.txt' overwrite into table pokes;
使用sql匯入hbase_table_1
SET hive.hbase.bulk=true;
insert overwrite table hbase_hive_1 select * from pokes;
匯入有分割槽的表
insert overwrite table hbase_hive_2 partition (day='2012-01-01') select * from pokes;

往Hive中插入資料同時會插入到HBase中

3.4、分別檢視Hive、HBase中的資料

OK,到此Hive、HBase整合成功。

——————————————————————————————————————————————————————————————————

下面再給出較複雜的測試例子

情況一、對於在hbase已經存在的表,在hive中使用CREATE EXTERNAL TABLE來建立聯絡

create external table hive_test (key int,gid map<string,string>,sid map<string,string>,uid map<string,string>) 
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' 
WITH SERDEPROPERTIES ("hbase.columns.mapping" ="a:,b:,c:")  
TBLPROPERTIES  ("hbase.table.name" = "test1");


查詢gid欄位中value值


Hive成功讀取到HBase中的資料

情況二、如果hbase表test2中的欄位為user:gid,user:sid,info:uid,info:level

在hive中建表語句為

CREATE EXTERNAL TABLE hive_test_2(key int,user map<string,string>,info map<string,string>) 
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' 
WITH SERDEPROPERTIES ("hbase.columns.mapping" ="user:,info:")  
TBLPROPERTIES  ("hbase.table.name" = "test2");

Hive成功讀取到HBase中的資料