Hbase和Hive的整合
文章目录
Hbase和Hive的整合一:为什么Hive要和Hbase整合,意义何在?二:整合原理三:整合步骤1)添加hbase连接的zk路径2)设置hbase在zk中的访问路径3)添加一个jar包到hive的classpath路径下
四:检验是否成功1.在hbase中创建表插入数据2.在hive中创建表解析hbase中的数据3.解释
一:为什么Hive要和Hbase整合,意义何在?
在hbase中不支持复杂查询,比如join | group by | count | sumhive的数据是无法更新的,除非去更改hdfs的原始文件,更改原始文件需要生成一个新的文件,十分费事。同时hive是进行海量数据统计分析,无法实时查询。 而hbase可以进行数据更新和海量数据的快速查询.
二:整合原理
Hive 与 HBase 利用两者本身对外的 API 来实现整合,主要是靠 HBaseStorageHandler 进 行通信,利用HBaseStorage Handler,Hive 可以获取到 Hive 表对应的 HBase 表名,列簇以及 列,InputFormat 和 OutputFormat 类,创建和删除 HBase 表等。Hive 访问 HBase 中表数据,实质上是通过 MapReduce 读取 HBase 表数据,其实现是在 MR 中,HiveHBaseTableInputFormat 完成对 HBase 表的切分,获取 RecordReader 对象来读 取数据。对 HBase 表的切分原则是一个 Region 切分成一个 Split,即表中有多少个 Regions,MR 中就 有多少个 Map。读取 HBase 表数据都是通过构建 Scanner,对表进行全表扫描,如果有过滤条件,则转化为 Filter。当过滤条件为 rowkey 时,则转化为对 rowkey 的过滤,Scanner 通过 RPC 调用 RegionServer 的 next()来获取数据
三:整合步骤
将hive和hbase整合(将hbase的四维表转化为二维表),hive读取hbase的数据。
在hive中进行整合:
1)添加hbase连接的zk路径
set hbase
.zookeeper
.quorum
=hadoop01:
2181,hadoop02:
2181,hadoop03:
2181;
2)设置hbase在zk中的访问路径
首先查看下 hbase存储的相关数据 在zk中的节点
<property
>
<name
>zookeeper
.znode
.parent
</name
>
<value>/hbase
</value>
</property
>
设置路径
set zookeeper
.znode
.parent
=/hbase
;
3)添加一个jar包到hive的classpath路径下
hive-hbase-handler-2.3.2.jar 是hbase和hive整合的核心包, 解析hbase的数据 到hive中 hive-hbase-handler-2.3.2.jar中关键的方法是HBaseStorageHandler
add jar
/home
/hadoop
/apps
/apache
-hive
-2.3.2-bin
/lib
/hive
-hbase
-handler-2.3.2.jar
;
list jar
;
四:检验是否成功
1.在hbase中创建表插入数据
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'
2.在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");
查看表信息:
select * from mingxing
;
mingxing
.rowkey mingxing
.base_info mingxing
.extra_info
rk001 {
"age":
"33","name":
"huangbo"} {
"math":
"44","province":
"beijing"}
rk002 {
"age":
"44","name":
"xuzheng"} {}
rk003 {
"age":
"55","gender":
"male","name":
"wangbaoqiang"} {}
rk004 {} {
"children":
"3","math":
"33","province":
"tianjin"}
rk005 {
"name":
"liutao"} {}
rk006 {} {
"name":
"liujialing"}
Time taken:
9.142 seconds
, Fetched:
6 row(s
)
解析部分列族信息:
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");
3.解释
serdeproperties 指定解析的属性的 hbase.columns.mapping 指定对应关系 需要解析的hbase表的rk 列族和 hive中的列的对应的关系 base_info: 解析hbase的整个 base_info 的列族 :key 行健的值 rowkey的获取 tblproperties 指定表的属性 hbase.table.name 指定需要解析的hbase的表名