Hive 整合Hbase(来自学习资料--博学谷)
1、摘要
Hive提供了與HBase的集成,使得能夠在HBase表上使用HQL語(yǔ)句進(jìn)行查詢(xún) 插入操作以及進(jìn)行Join和Union等復(fù)雜查詢(xún)、同時(shí)也可以將hive表中的數(shù)據(jù)映射到Hbase中。
2、應(yīng)用場(chǎng)景
2.1 將ETL操作的數(shù)據(jù)存入HBase
2.2 HBase作為Hive的數(shù)據(jù)源
2.3 構(gòu)建低延時(shí)的數(shù)據(jù)倉(cāng)庫(kù)
3、環(huán)境準(zhǔn)備
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,用于將數(shù)據(jù)存儲(chǔ)到HDFS以外的其他存儲(chǔ)上。并方便的通過(guò)hive進(jìn)行插入、查詢(xún)等操作。同時(shí)hive提供了針對(duì)Hbase的hive-hbase-handler。這使我們?cè)谑褂胔ive節(jié)省開(kāi)發(fā)M/R代碼成本的同時(shí)還能獲得HBase的特性來(lái)快速響應(yīng)隨機(jī)查詢(xún)。
但是,hive自帶的hive-hbase-handler是針對(duì)特定版本的Hbase的,比如,0.7.0版本的hive編譯時(shí)使用的是0.89.0版本的Hbase,0.6.0版本的hive默認(rèn)使用0.20.3版本的hbase進(jìn)行編譯。如果能夠找到對(duì)應(yīng)的版本,可以跳過(guò)編譯的步驟直接使用。不過(guò),我們現(xiàn)狀已經(jīng)找不到這些版本的Hbase與之配合使用了。所以只好自己來(lái)編譯這個(gè)jar包。
注:使用不匹配的版本,一些功能會(huì)發(fā)生異常。其原因是由于沒(méi)有重新編譯storage-handler組件,發(fā)現(xiàn)在hive中查詢(xún)HBase表存在問(wèn)題。hive-hbase-handler.jar的作用在hbase與hive整合的時(shí)候發(fā)揮了重要作用,有了這個(gè)包,hbase與hive才能通信。
如果想hbase1.x與hive1.x整合,需要編譯hive1.x 代碼本身
hive-2.3.2 兼容 hbase 1.4.2版本
編譯:
創(chuàng)建項(xiàng)目
在eclipse中創(chuàng)建一個(gè)項(xiàng)目。Java project即可。
隨便起個(gè)名,finish即可。
導(dǎo)入代碼
在創(chuàng)建好的項(xiàng)目上點(diǎn)擊右鍵,選擇Import
選擇General下的FileSystem
找到hive-1.2.1\src\hbase-handler\src\java目錄選擇其中的org目錄導(dǎo)入
添加依賴(lài)包
導(dǎo)入代碼后可以看到很多的錯(cuò)誤提示。這時(shí)由于沒(méi)有引入依賴(lài)的jar包導(dǎo)致的。下面,我們引入,需要hadoop、hive、hbase下相關(guān)的lib包
新建lib目錄,把對(duì)應(yīng)的依賴(lài)包,導(dǎo)入
選擇Build Path點(diǎn)擊Add to Bulid Path
至此可以導(dǎo)出我們需要的jar包了。在org.apache.hadoop.hive.hbase包上點(diǎn)擊右鍵,選擇export
選擇java下的JAR file,選擇一個(gè)生成位置,即可點(diǎn)擊完成。
到這里我們就生成了符合自己Hbase版本的hive-hbase-handler了。
3.2 hive與hbase整合環(huán)境配置
(1)修改hive-site.xml文件,添加配置屬性(zookeeper的地址)
<property> <name>hbase.zookeeper.quorum</name> <value>itcast01:2181,itcast02:2181,itcast03:2181</value> </property>(2)引入hbase的依賴(lài)包
將hbase安裝目錄下的lib文件夾下的包導(dǎo)入到hive的環(huán)境變量中
在hive-env.sh 文件中添加
export HIVE_CLASSPATH=$HIVE_CLASSPATH:/var/local/hbase/lib/*至此、hive與hbase整合環(huán)境準(zhǔn)備完成。
4、實(shí)戰(zhàn)
4.1 hbase表映射到hive表中
① 在hbase中創(chuàng)建表:表名hbase_test, 有三個(gè)列族 f1、f2、f3
create 'hbase_test',{NAME => 'f1',VERSIONS => 1},{NAME => 'f2',VERSIONS => 1},{NAME => 'f3',VERSIONS => 1}② 插入數(shù)據(jù)
put 'hbase_test','r1','f1:name','zhangsan' put 'hbase_test','r1','f2:age','20' put 'hbase_test','r1','f3:sex','male' put 'hbase_test','r2','f1:name','lisi' put 'hbase_test','r2','f2:age','30' put 'hbase_test','r2','f3:sex','female' put 'hbase_test','r3','f1:name','wangwu' put 'hbase_test','r3','f2:age','40' put 'hbase_test','r3','f3:sex','male'③ 查詢(xún)數(shù)據(jù)
④ 創(chuàng)建基于hbase的hive表
以下在hive的命令行窗口中執(zhí)行
這里使用外部表映射到HBase中的表,這樣,在Hive中刪除表,并不會(huì)刪除HBase中的表,否則,就會(huì)刪除。另外,除了rowkey,其他三個(gè)字段使用Map結(jié)構(gòu)來(lái)保存HBase中的每一個(gè)列族。
? hbase.columns.mapping
Hive表和HBase表的字段映射關(guān)系,分別為:Hive表中第一個(gè)字段映射:key(rowkey),第二個(gè)字段映射列族f1,第三個(gè)字段映射列族f2,第四個(gè)字段映射列族f3
? hbase.table.name
HBase中表的名字
⑤ hive中查詢(xún)hbase表
hive> select * from hiveFromHbase;
可以看到,Hive中只有一行數(shù)據(jù),因?yàn)橹挥幸粋€(gè)rowkey,每一個(gè)列族的列和值,分別被存儲(chǔ)到Map結(jié)構(gòu)中
⑥ Hive中插入數(shù)據(jù)到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張表的數(shù)據(jù)
hive表hiveFromHbase:
Hbase表hbase_test:
Hive中的外部表hiveFromHbase,就和其他外部表一樣,只有一份元數(shù)據(jù),真正的數(shù)據(jù)是在HBase表中,Hive通過(guò)hive-hbase-handler來(lái)操作HBase中的表。
4.2 hive表映射到hbase表中
① 創(chuàng)建映射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整合時(shí),需要添加:
"hbase.mapred.output.outputtable" = "hbaseFromhive" 表屬性TBLPROPERTIES ("hbase.table.name" = "hbaseFromhive","hbase.mapred.output.outputtable"="hbaseFromhive");如果不添加會(huì)報(bào)錯(cuò):Must specify table name
② 查看hbase映射表是否產(chǎn)生
③ 查看hbase映射表的表結(jié)構(gòu)和數(shù)據(jù)
由于hive表中沒(méi)有加載數(shù)據(jù),此時(shí)hbase中映射的表也無(wú)數(shù)據(jù)
④ Hive表加載數(shù)據(jù)
數(shù)據(jù)來(lái)源于另一張表hive_source;
查看hive_source的表結(jié)構(gòu)和數(shù)據(jù)
加載數(shù)據(jù):
insert overwrite table hive_test select * from hive_source;⑤ 查看hive和hbase中表的數(shù)據(jù)
映射表可以查看到hive表中的數(shù)據(jù)。
總結(jié)
以上是生活随笔為你收集整理的Hive 整合Hbase(来自学习资料--博学谷)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 用优盘扫描怎么弄 如何使用优盘扫描?
- 下一篇: win10怎么还原大白菜u盘启动 Win