Hive整合Hbase的必要性?
1、Hbase介绍
Hbase是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统。
1)线性扩展,随着数据量增多可以通过节点扩展进行支撑;
2)数据存储在hdfs上,备份机制健全;
3)通过zookeeper协调查找数据,访问速度快。
2、Hive介绍
Hive是基于Hadoop的一个数据仓库工具。
1)底层数据存储在hdfs上;
2)提供HQL查询功能,本质是将SQL语句转化成mr任务;
3)可以将结构化的数据映射成一张数据库表。
3、Hive整合Hbase的必要性
Hbase适合存数据,Hive SQL适合操作数据,整合后,我们可以在Hbase上使用HQL语句进行查询、插入以及Join和Union等复杂操作。
Hive整合Hbase的应用场景?
- 将ETL的数据存入Hbase
- Hbase作为Hive的数据源
- 构建低延时的数据仓库
如何整合?
首先要考虑的是版本兼容,如果用的是CDH版本的软件,则不存在这个问题,apache部分版本之间有兼容性问题,本篇不做考虑,大家可以Google一下,资料很多。
下面开始整合:
1、修改所有节点hive的hive-site.xml配置文件,添加zk属性:
<property>
<name>hbase.zookeeper.quorum</name>
<value>node01:2181,node02:2181,node03:2181</value>
</property>
2、修改所有节点Hive的hive-env.sh文件,在Hive中引入Hbase的依赖包:
export HIVE_CLASSPATH=$HIVE_CLASSPATH:/export/servers/hbase-1.2.1/lib/*
至此,整合完毕。
如何操作?
- 首先,开启集群的zk、hbase、hdfs、hive等服务;
- 进入hbase shell以及hive;
- 实战。
如何将Hbase表映射到Hive?
1、在hbase中创建一张表
create 'hbase_test',{NAME => 'f1',VERSIONS => 1},{NAME => 'f2',VERSIONS => 1},{NAME => 'f3',VERSIONS => 1}
2、插入数据
put 'hbase_test','r1','f1:name','zhangsan'
put 'hbase_test','r1','f2:age','20'
put 'hbase_test','r1','f3:sex','male'
put 'hbase_test','r2','f1:name','lisi'
put 'hbase_test','r2','f2:age','30'
put 'hbase_test','r2','f3:sex','female'
put 'hbase_test','r3','f1:name','wangwu'
put 'hbase_test','r3','f2:age','40'
put 'hbase_test','r3','f3:sex','male'
3、Hbase查询数据
scan 'hbase_test';
4、在Hive中创建基于Hbase的Hive表
CREATE EXTERNAL TABLE hiveFromHbase(
rowkey string,
f1 map<STRING,STRING>,
f2 map<STRING,STRING>,
f3 map<STRING,STRING>
) STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,f1:,f2:,f3:")
TBLPROPERTIES ("hbase.table.name" = "hbase_test");
5、Hive中查询数据
select * from hivefromhbase;
Hbase表添加数据,同步到Hive中
在hbase中执行以下操作,在hive中可以直接看到新增数据:
put 'hbase_test','r4','f3:age','18'
Hive中添加数据,同步到Hbase中
如何将Hive数据映射到Hbase?
1、在hive中创建映射hbase的表
create table hive_test(
id string,
name string,
age int,
address string
)STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,f1:name,f2:age,f3:address")
TBLPROPERTIES ("hbase.table.name" = "hbaseFromhive");