hive和hbase整合 構建低延遲的數據倉庫

hive和hbase整合 構建低延遲的數據倉庫

1、摘要

Hive提供了與HBase的集成,使得能夠在HBase表上使用HQL語句進行查詢 插入操作以及進行Join和Union等複雜查詢、同時也可以將hive表中的數據映射到Hbase中。

2、應用場景
2.1 將ETL操作的數據存入HBase

在這裏插入圖片描述

2.2 HBase作爲Hive的數據源

在這裏插入圖片描述
2.3 構建低延時的數據倉庫
在這裏插入圖片描述
3、環境準備
3.1 hive與hbase版本兼容性

Hive版本 hive-1.2.1、hbase的版本hbase-1.2.1
hbase與hive哪些版本兼容?
1.hive0.90與hbase0.92是兼容的,早期的hive版本與hbase0.89/0.90兼容。
2.hive1.x與hbase0.98.x或則更低版本是兼容的。
3.hive2.x與hbase1.x及比hbase1.x更高版本兼容。

Hive 0.6.0推出了storage-handler,用於將數據存儲到HDFS以外的其他存儲上。並方便的通過hive進行插入、查詢等操作。同時hive提供了針對Hbase的hive-hbase-handler。這使我們在使用hive節省開發M/R代碼成本的同時還能獲得HBase的特性來快速響應隨機查詢。
但是,hive自帶的hive-hbase-handler是針對特定版本的Hbase的,比如,0.7.0版本的hive編譯時使用的是0.89.0版本的Hbase,0.6.0版本的hive默認使用0.20.3版本的hbase進行編譯。如果能夠找到對應的版本,可以跳過編譯的步驟直接使用。不過,我們現狀已經找不到這些版本的Hbase與之配合使用了。所以只好自己來編譯這個jar包。
注:使用不匹配的版本,一些功能會發生異常。其原因是由於沒有重新編譯storage-handler組件,發現在hive中查詢HBase表存在問題。hive-hbase-handler.jar的作用在hbase與hive整合的時候發揮了重要作用,有了這個包,hbase與hive才能通信。
如果想hbase1.x與hive1.x整合,需要編譯hive1.x 代碼本身
編譯:
創建項目
在eclipse中創建一個項目。Java project即可。
在這裏插入圖片描述

隨便起個名,finish即可。
導入代碼
在創建好的項目上點擊右鍵,選擇Import

選擇General下的FileSystem
在這裏插入圖片描述

找到hive-1.2.1\src\hbase-handler\src\java目錄選擇其中的org目錄導入

在這裏插入圖片描述

添加依賴包
導入代碼後可以看到很多的錯誤提示。這時由於沒有引入依賴的jar包導致的。下面,我們引入,需要hadoop、hive、hbase下相關的lib包。
新建lib目錄,把對應的依賴包,導入
在這裏插入圖片描述
選擇Build Path點擊Add to Bulid Path
至此可以導出我們需要的jar包了。在org.apache.hadoop.hive.hbase包上點擊右鍵,選擇export
選擇java下的JAR file,選擇一個生成位置,即可點擊完成。
在這裏插入圖片描述
到這裏我們就生成了符合自己Hbase版本的hive-hbase-handler了。

3.2 hive與hbase整合環境配置
(1)修改hive-site.xml文件,添加配置屬性(zookeeper的地址)

<property>      
<name>hbase.zookeeper.quorum</name>
<value>itcast01:2181,itcast02:2181,itcast03:2181</value>
</property>

(2)引入hbase的依賴包
將hbase安裝目錄下的lib文件夾下的包導入到hive的環境變量中

在hive-env.sh 文件中添加
export HIVE_CLASSPATH=$HIVE_CLASSPATH:/var/local/hbase/lib/*

至此、hive與hbase整合環境準備完成。
4、實戰
4.1 hbase表映射到hive表中
① 在hbase中創建表:表名hbase_test, 有三個列族 f1、f2、f3

create 'hbase_test',{NAME => 'f1',VERSIONS => 1},{NAME => 'f2',VERSIONS => 1},{NAME => 'f3',VERSIONS => 1}

在這裏插入圖片描述
② 插入數據
在這裏插入圖片描述
put ‘hbase_test’,‘r3’,‘f3:sex’,‘male’
在這裏插入圖片描述

③ 查詢數據

在這裏插入圖片描述
④ 創建基於hbase的hive表

CREATE EXTERNAL TABLE hiveFromHbase(
rowkey string,
f1 map<STRING,STRING>,
f2 map<STRING,STRING>,
f3 map<STRING,STRING>
) STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,f1:,f2:,f3:")
TBLPROPERTIES ("hbase.table.name" = "hbase_test");

這裏使用外部表映射到HBase中的表,這樣,在Hive中刪除表,並不會刪除HBase中的表,否則,就會刪除。另外,除了rowkey,其他三個字段使用Map結構來保存HBase中的每一個列族。

hbase.columns.mapping
Hive表和HBase表的字段映射關係,分別爲:Hive表中第一個字段映射:key(rowkey),第二個字段映射列族f1,第三個字段映射列族f2,第四個字段映射列族f3
hbase.table.name
HBase中表的名字

⑤ hive中查詢hbase表

在這裏插入圖片描述

可以看到,Hive中有3行數據,因爲有3個rowkey,每一個列族的列和值,分別被存儲到Map結構中

⑥ Hive中插入數據到HBase表

insert into table hiveFromHbase
SELECT 'r4' AS rowkey,
map('name','zhaoliu') AS f1,
map('age','50') AS f2,
map('sex','male') AS f3
from person limit 1;

插入成功後查看2張表的數據

hive表hiveFromHbase:

在這裏插入圖片描述

Hbase表hbase_test:

在這裏插入圖片描述
Hive中的外部表hiveFromHbase,就和其他外部表一樣,只有一份元數據,真正的數據是在HBase表中,Hive通過hive-hbase-handler來操作HBase中的表。

4.2 hive表映射到hbase表中

① 創建映射hbase的表


create   table hive_test(
id string,
name string,
age int,
address string
)STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,f1:name,f2:age,f3:address")
TBLPROPERTIES ("hbase.table.name" = "hbaseFromhive");

在hive1.2.1 跟hbase 0.98整合時,需要添加:

“hbase.mapred.output.outputtable” = “hbaseFromhive” 表屬性

TBLPROPERTIES (“hbase.table.name” = “hbaseFromhive”,“hbase.mapred.output.outputtable”=“hbaseFromhive”);

如果不添加會報錯:Must specify table name

② 查看hbase映射表是否產生

在這裏插入圖片描述

③ 查看hbase映射表的表結構和數據
在這裏插入圖片描述

在這裏插入圖片描述
由於hive表中沒有加載數據,此時hbase中映射的表也無數據

④ Hive表加載數據

數據來源於另一張表hive_source;

查看hive_source的表結構和數據

在這裏插入圖片描述

加載數據:
insert overwrite table hive_test select * from hive_source;
⑤ 查看hive和hbase中表的數據

在這裏插入圖片描述

在這裏插入圖片描述

映射表可以查看到hive表中的數據。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章