Hive 整合 Hbase 详解

Hive 整合 Hbase

从以下三个方面进行说明
1.整合原因
2.整合原理
3.整合步骤 (步骤又分为五步)

  1. 创建 hbase 表, 插入数据
  2. 指定 hive 中 hbase 的 zookeeper 访问路径
  3. 指定 hbase 在 zookeeper 中存储数据的节点
  4. 在 hive 的 classpath 下指定 hive-habse 整合的 jar包
  5. 整合完成, 然后在 hive 中建表去关联 hbase 中的表
1.整合原因

答: hive 是高延迟、结构化、面向分析的数据仓库

​ hbase 是低延迟、非结构化、面向编程的分布式数据库

​ 两者进行整合, 就是为了中和两者的特性, 获得最优的数据处理方式.

例如: Hive QL 依据函数可以实现复杂的查询, 而 Hbase 不支持 join 等两表联查操作

简而言之: 通过“中间件”让 hbase 拥有 hive 那种 SQL 查询的特性

2.整合原理

答: Hive与HBase整合的实现是利用两者本身对外的API接口互相通信来完成的,

​ 具体工作由 Hive 的 lib 目录中的 hive-hbase-handler-*.jar 工具类来实现 .

hive 和 hbase 整合实际上不是通过配置文件, 而是通过建表语句中指定表的来源, 以及参数设置.

  1. Hive 访问 HBase 中表数据,实质上是通过 MapReduce 读取 HBase 表数据

其实现是在 MR中,使用 HiveHBaseTableInputFormat 完成对 HBase 表的切分,

获取 RecordReader 对象来读取数据。

  1. 对 HBase 表的切分原则是一个 Region 切分成一个 Split,

即表中有多少个 Regions,MR 中就有多少个 Map。

  1. 读取 HBase 表数据都是通过构建 Scanner,对表进行全表扫描

如果有过滤条件,则转化为Filter

​ 例如: 当过滤条件为 rowkey 时,则转化为对 rowkey 的过滤

​ Scanner 通过 RPC 调用RegionServer 的 next()来获取数据

3.整合步骤
  1. 创建 Hbase 表 , 插入数据 (整合目的就是将此表中数据导入到hive中进行分析)
建表: 
create 'mingxing',{NAME => 'base_info',VERSIONS => 1},{NAME => 'extra_info',VERSIONS => 1}
插入数据:
put 'mingxing','rk001','base_info:name','huangbo'
put 'mingxing','rk001','base_info:age','33'
put 'mingxing','rk001','extra_info:math','44'
put 'mingxing','rk001','extra_info:province','beijing'
put 'mingxing','rk002','base_info:name','xuzheng'
put 'mingxing','rk002','base_info:age','44'
put 'mingxing','rk003','base_info:name','wangbaoqiang'
put 'mingxing','rk003','base_info:age','55'
put 'mingxing','rk003','base_info:gender','male'
put 'mingxing','rk004','extra_info:math','33'
put 'mingxing','rk004','extra_info:province','tianjin'
put 'mingxing','rk004','extra_info:children','3'
put 'mingxing','rk005','base_info:name','liutao'
put 'mingxing','rk006','extra_info:name','liujialing'

建表以后在 hbase 中查询如下图

在这里插入图片描述

​ 以下操作在 hive 客户端中

  1. 指定 hive 中 hbase 的 zookeeper 访问路径 (任何操作访问 hbase 都要通过 ZooKeeper)
set hbase.zookeeper.quorum=hdp01:2181,hdp02:2181,hdp03:2181;
  1. 指定 hbase 在 zookeeper 中存储数据的节点

    ( zk中存储着 hbase 的表结构信息,故hive想要获取hbase中的表, 这一步也是不可缺少的 )

set zookeeper.znode.parent=/hbase; 
  1. 指定 hive-habse 整合的 jar包 ( jar包路径在hive的安装目录下的 lib 目录中 )

    ( 之前了解到两者整合主要是利用两者对外提供的 API 接口 , 需将其放置在 hive 的 classpath 下)

语法: add jar jar包路径 (此命令就是将该路径下jar包加载到hive的classpath下)
命令: add jar /home/hadoop/apps/apache-hive-2.3.2-bin/lib/hive-hbase-handler-2.3.2.jar;
  1. 整合完成, 然后在 hive 中建表去关联 hbase 中的表
create external table mingxing(rowkey string, base_info map<string, string>, extra_info map<string, string>) 
row format delimited fields terminated by '\t' 
stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
with serdeproperties ("hbase.columns.mapping" = ":key,base_info:,extra_info:") 
tblproperties ("hbase.table.name" = "mingxing");

建表语句详解 :

create external table mingxing	
	创建外部表,叫 mingxing (名称可以与hbase中表名不一致,但在下面属性设置中,对应关系要一致)
(rowkey string, base_info map<string, string>, extra_info map<string, string>) 
	通常在hive中指定三个参数,row_key,加上两个列族,因为列族中列不确定,故使用map<>来表示
row format delimited fields terminated by '\t' 
	列之间分隔符
stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
	原始数据存在hbase中,故指定hbase中的处理类HBaseStorageHandler
with serdeproperties ("hbase.columns.mapping" = ":key,base_info:,extra_info:") 
	指定输入输出关系, 列之间的对应关系,对应上面hive建表中的三个参数
tblproperties ("hbase.table.name" = "mingxing");
	指定表之间的对关系

至此 hive 与 hbase 整合, 以及两者之间表进行连接均执行完毕.

  1. 拓展
上面第五步的hive建表,与hbase 列族中所有列进行对应关系连接;
但是如果仅仅需要与hbase中部分列进行关联呢? 此时建表语句如下:
create external table mingxing1(rowkey string, name string, province string)
row format delimited fields terminated by '\t'
stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
with serdeproperties ("hbase.columns.mapping" = ":key,base_info:name,extra_info:province")
tblproperties ("hbase.table.name" = "mingxing");

建表语句详解

此时与完全列关联的建表语句做出改变的是两部分:
1.建表时参数直接指定对应列名
create external table mingxing1(rowkey string, name string, province string)
2.指定映射的输入输出关系时
with serdeproperties ("hbase.columns.mapping" = ":key,base_info:name,extra_info:province")
改变的部分: base_info列族中的name列,extra_info列族中的province列进行映射关系

综上所述

在建表时,想要更改hive与hbase之间具体关联的列,根据如下对应关系进行修改即可:
	hbase.columns.mapping  	指定hbase和hive表的字段的映射关系
	:key,  					获取rowkey 
	base_info:name,  		获取base_info 列族中 name 列的值
	extra_info:province  	获取 extra_info 列族中 province 列的值
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值