Hive 整合 Hbase
从以下三个方面进行说明
1.整合原因
2.整合原理
3.整合步骤 (步骤又分为五步)
- 创建 hbase 表, 插入数据
- 指定 hive 中 hbase 的 zookeeper 访问路径
- 指定 hbase 在 zookeeper 中存储数据的节点
- 在 hive 的 classpath 下指定 hive-habse 整合的 jar包
- 整合完成, 然后在 hive 中建表去关联 hbase 中的表
1.整合原因
答: hive 是高延迟、结构化、面向分析的数据仓库
hbase 是低延迟、非结构化、面向编程的分布式数据库
两者进行整合, 就是为了中和两者的特性, 获得最优的数据处理方式.
例如: Hive QL 依据函数可以实现复杂的查询, 而 Hbase 不支持 join 等两表联查操作
简而言之: 通过“中间件”让 hbase 拥有 hive 那种 SQL 查询的特性
2.整合原理
答: Hive与HBase整合的实现是利用两者本身对外的API接口互相通信来完成的,
具体工作由 Hive 的 lib 目录中的 hive-hbase-handler-*.jar 工具类来实现 .
hive 和 hbase 整合实际上不是通过配置文件, 而是通过建表语句中指定表的来源, 以及参数设置.
- Hive 访问 HBase 中表数据,实质上是通过 MapReduce 读取 HBase 表数据,
其实现是在 MR中,使用 HiveHBaseTableInputFormat 完成对 HBase 表的切分,
获取 RecordReader 对象来读取数据。
- 对 HBase 表的切分原则是一个 Region 切分成一个 Split,
即表中有多少个 Regions,MR 中就有多少个 Map。
- 读取 HBase 表数据都是通过构建 Scanner,对表进行全表扫描,
如果有过滤条件,则转化为Filter。
例如: 当过滤条件为 rowkey 时,则转化为对 rowkey 的过滤
Scanner 通过 RPC 调用RegionServer 的 next()来获取数据
3.整合步骤
- 创建 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 客户端中
set hbase.zookeeper.quorum=hdp01:2181,hdp02:2181,hdp03:2181;
set zookeeper.znode.parent=/hbase;
-
指定 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;
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 整合, 以及两者之间表进行连接均执行完毕.
- 拓展
上面第五步的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 列的值