hbase和Hive的整合

hbase和Hive的整合

1.原理

Hive 与 HBase 利用两者本身对外的 API 来实现整合,主要是靠 HBaseStorageHandler 进行通信,利用 HBaseStorageHandler,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()来获取数据

2.实例

实例
需求:将hbase中的一张user_info表的数据同步到hive的表中
hbase表的数据如下

hbase(main):002:0> scan “user_info”
hbase和Hive的整合

Hive端的操作

1.进入hive的客户端
2.为了让hive找到hbase的路径需要进行如下的设置

  • 指定 hbase 所使用的 zookeeper 集群的地址:默认端口是 2181,可以不写
    set hbase.zookeeper.quorum=hadoop01:2181,hadoop02:2181,hadoop03:2181;
  • 指定 hbase 在 zookeeper 中使用的根目录
    set zookeeper.znode.parent=/hbase;
    hbase和Hive的整合
    上边的两部的意思是hive先找到zookeeper,之后再在zk上找到hbase的目录

3.hive的安装文件中自带了和hbase整合的包,将这个包加载到hive中

add jar/home/hadoop/apps/apache-hive-2.3.2-bin/lib/hive-hbase-handler-2.3.2.jar;
hbase和Hive的整合
4.在hive端创建基于hbase表的hive表
create external table user_info_hive(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” = “user_info”);
下边对着个建表的语句进行解析

create external table user_info_hive(rowkey string, base_info map<string, string>, extra_info map<string, string>)

创建一张外部表,名字叫做user_info_hive 其中有三列,分别是string 的rowkey,列簇base_info 类型是一个map集合,集合中数列簇中的列对应的值,列簇extra_info 类型是一个map集合,集合中数列簇中的列对应的值,

row format delimited fields terminated by '\t’

列分隔符是"\t"

stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler’

org.apache.hadoop.hive.hbase.HBaseStorageHandler:处理 hive 到 hbase 转换关系的处理器

with serdeproperties (“hbase.columns.mapping” = “:key,base_info:,extra_info:”)

hbase.columns.mapping:定义 hbase 的列簇和列到 hive 的映射关系

tblproperties (“hbase.table.name” = “user_info”);

hbase.table.name:hbase 表名
最终的结果如下
hbase和Hive的整合
如果只想将hbase表中的指定的列放在hive的表中需要如何操作呢
create external table user_info_hive1(rowkey string, name string, Hobbies 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:Hobbies”)
tblproperties (“hbase.table.name” = “user_info”);

注意上边的加粗的地方的有什么不同
最终的结果如下
hbase和Hive的整合