一、原理:
Hive 与 HBase 利用两者本身对外的 API 来实现整合,主要是靠 HBaseStorageHandler 进行通信,利用 HBaseStorageHandler,Hive 可以获取到 Hive 表对应的 HBase 表名,列簇以及列,InputFormat 和 OutputFormat 类,创建和删除 HBase 表等。
Hive 访问 HBase 中表数据,实质上是通过 MapReduce 读取 HBase 表数据,其实现是在 MR中,使用 HiveHBaseTableInputFormat 完成对 HBase 表的切分,获取 RecordReader 对象来读取数据。
对HBase 表的切分原则是一个Region 切分成一个Split,即表中有多少个Regions, MapReduce中就有多少个 Map。
读取 HBase 表数据都是通过构建 Scanner,对表进行全表扫描,如果有过滤条件,则转化为Filter。当过滤条件为 RowKey 时,则转化为对 RowKey 的过滤,Scanner 通过 RPC 调用RegionServer 的 next()来获取数据
二、创建表
创建 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'
三、Hive端操作:
1)指定 hbase 所使用的 zookeeper 集群的地址:默认端口是 2181,可以不写
set hbase.zookeeper.quorum=centos01:2181,centos02:2181centos03:2181;
2)指定 hbase 在 zookeeper 中使用的根目录
set zookeeper.znode.parent=/hbase;
hbase的相关数据(-root的寻址路径等)在zookeeper上的存储的znode路径
zookeeper.znode.parent
/hbase
Root ZNode for HBase in ZooKeeper. All of HBase's ZooKeeper files that are configured with a relative path will go under this node.By default, all of HBase's ZooKeeper file path are configured with a relative path, so they will all go under this directory unless changed.
3)加入指定的处理 jar
add jar /home/wqing/apps/apache-hive-2.3.2-bin/lib/hive-hbase-handler-2.3.2.jar;
hive只能加载自己的classpath下的
四、创建基于 HBase 表的 hive 表
所有列簇:
create external table mingxing(rowkey string, base_info map
, extra_info map ) 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 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","hbase.mapred.output.outputtable"="mingxing");
解释文字:
org.apache.hadoop.hive.hbase.HBaseStorageHandler:处理 hive 到 hbase 转换关系的处理器
hbase.columns.mapping:定义 hbase 的列簇和列到 hive 的映射关系
hbase.table.name:hbase 表名
tblproperties:指定关联表名
with serdeproperties:指定行键,列族的关联信息
建表的过程中自动进行关联
":key 代表取行键的值,
base_info: 取得base_info所有列信息,
extra_info: 取的是extra_info所有的列信息"
五、验证:
select * from mingxing;
select count(*) from mingxing;
select rowkey,base_info['name'] from mingxing;
select rowkey,extra_info['province'] from mingxing;
select rowkey,base_info['name'], extra_info['province'] from mingxing;