最具影响力的数字化技术在线社区

168大数据

 找回密码
 立即注册

QQ登录

只需一步,快速开始

1 2 3 4 5
打印 上一主题 下一主题
开启左侧

[Hive] Hive 整合Hbase

[复制链接]
跳转到指定楼层
楼主
发表于 2018-8-27 11:09:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多数据大咖,获取更多知识干货,轻松玩转大数据

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 168主编 于 2018-8-27 11:12 编辑

来源:https://blog.csdn.net/toto1297488504/article/details/81506388
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 代码本身

hive-2.3.2 兼容 hbase 1.4.2版本

编译:
创建项目
在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的地址)

[AppleScript] 纯文本查看 复制代码
<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}

② 插入数据

[AppleScript] 纯文本查看 复制代码
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'

③ 查询数据

④ 创建基于hbase的hive表
以下在hive的命令行窗口中执行

[AppleScript] 纯文本查看 复制代码
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> select * from hiveFromHbase;

可以看到,Hive中只有一行数据,因为只有一个rowkey,每一个列族的列和值,分别被存储到Map结构中

⑥ Hive中插入数据到HBase表

[AppleScript] 纯文本查看 复制代码
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的表

[AppleScript] 纯文本查看 复制代码
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整合时,需要添加:

[AppleScript] 纯文本查看 复制代码
"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表中的数据。



楼主热帖
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 转播转播 分享分享 分享淘帖 赞 踩

168大数据 - 论坛版权1.本主题所有言论和图片纯属网友个人见解,与本站立场无关
2.本站所有主题由网友自行投稿发布。若为首发或独家,该帖子作者与168大数据享有帖子相关版权。
3.其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和168大数据的同意,并添加本文出处。
4.本站所收集的部分公开资料来源于网络,转载目的在于传递价值及用于交流学习,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。
5.任何通过此网页连接而得到的资讯、产品及服务,本站概不负责,亦不负任何法律责任。
6.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源,若标注有误或遗漏而侵犯到任何版权问题,请尽快告知,本站将及时删除。
7.168大数据管理员和版主有权不事先通知发贴者而删除本文。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

关于我们|小黑屋|Archiver|168大数据 ( 京ICP备14035423号|申请友情链接

GMT+8, 2024-5-16 03:48

Powered by BI168大数据社区

© 2012-2014 168大数据

快速回复 返回顶部 返回列表