淘先锋技术网

首页 1 2 3 4 5 6 7

hbase和hive的关系

hbase 是nosql分布式数据库
		表结构:是一个四维表
        可以实现近实时随机查询
        没有 join等分析函数
        
hive 是数据仓库
        表结构 和 hdfs 数据结构做一个映射,结构并没有改变
        擅长数据分析,提供了比较完善的函数

如果想对hbase中的数据做数据分析,目前有3种方式:
1)使用mapreduce;
2)整合hive;
3)用spark也可以做,spark也可以读hbase中的数据。
hbase自己做数据分析,语法不支持,所以将hbase和hive进行整合,便于对hbase的数据做统计分析.

整合Hbase和hive

整合原理:

hive读取hbase中的数据,将hbase中的数据转换为二维表数据。相当于hive将hbase中的数据进行压平。

hive进行整合hbase的核心包hive-hbase-handler-2.3.2.jar,其中整合的核心方法是:包里的HBaseStorageHandler方法。

	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()来获取数据
整合方法:

以下操作是在hive的shell操作下:
先把hive设置本地模式:set hive.exec.mode.local.auto=true;

1)设置hbase的zk访问路径
set  hbase.zookeeper.quorum=hadoop01:2181,hadoop02:2181,hadoop03:2181;

2)设置hbase在zk的保存路径 (存储节点路径),又叫寻址路径。
set zookeeper.znode.parent=/hbase;

3)将hive的解析hbase的jar包添加到hive的classpath下
add jar /home/jacob/app/apache-hive-2.3.2-bin/lib/hive-hbase-handler-2.3.2.jar;

查看是否添加过来:
list jars;

整合完之后,在hive中读取hbase的表
以下为举例:
在hbase中有如下的表:

hbase(main):004:0> scan "mingxing"
ROW                            COLUMN+CELL                                                                             
 rk001                         column=base_info:age, timestamp=1583625287636, value=33                                 
 rk001                         column=base_info:name, timestamp=1583625287196, value=huangbo                           
 rk001                         column=extra_info:math, timestamp=1583625287824, value=44                               
 rk001                         column=extra_info:province, timestamp=1583625287945, value=beijing                      
 rk002                         column=base_info:age, timestamp=1583625288187, value=44                                 
 rk002                         column=base_info:name, timestamp=1583625288086, value=xuzheng                           
 rk003                         column=base_info:age, timestamp=1583625288360, value=55                                 
 rk003                         column=base_info:gender, timestamp=1583625288438, value=male                            
 rk003                         column=base_info:name, timestamp=1583625288268, value=wangbaoqiang                      
 rk004                         column=extra_info:children, timestamp=1583625288698, value=3                            
 rk004                         column=extra_info:math, timestamp=1583625288500, value=33                               
 rk004                         column=extra_info:province, timestamp=1583625288585, value=tianjin                      
 rk005                         column=base_info:name, timestamp=1583625288795, value=liutao                            
 rk006                         column=extra_info:name, timestamp=1583625290356, value=liujialing 

在hive建表, 建表语句指定解析类。 会转化成MR。

关联全部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");

简单解释:

with serdeproperties:指定hbase表结构 和hive的对应关系

hbase.columns.mapping:指定hbase表和hive表映射。
注意:映射是和hive中的建表语句一一对应的。
	指定hbase 对应值的时候,都是 key:value 这种形式。 k(列族名):v(列族下的对应的列和值)
	此例中:      key:base_info
                value:  name:zs    age:12
	:key  获取rowkey的值
	
hbase.table.name:指定对应的表名

在hive中查看结果:

hive> select * from mingxing;
OK
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: 0.907 seconds, Fetched: 6 row(s)
关联部分 hbase的数据:

仍以上面的mingxing表为例,想查询表中的 姓名、年龄和数学成绩

create external 
create table mingxing_02(rowkey string,name string,age int,math int) 
row format delimited fields terminated by '\t' 
stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
with serdeproperties ("hbase.columns.mapping" = ":key,base_info:name,base_info:age,extra_info:math") 
tblproperties ("hbase.table.name" = "mingxing");

在hive中查看结果:

hive> select * from mingxing_02;
OK
mingxing_02.rowkey      mingxing_02.name        mingxing_02.age mingxing_02.math
rk001   huangbo 33      44
rk002   xuzheng 44      NULL
rk003   wangbaoqiang    55      NULL
rk004   NULL    NULL    33
rk005   liutao  NULL    NULL
Time taken: 1.037 seconds, Fetched: 5 row(s)

rk006的extra_info里面没有math,base_info里面也没有数据,是一个空字段,所以结果中就不显示了。最终结果只显示5条。