Hive整合Hbase

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/*

至此,整合完毕。

如何操作?

  1. 首先,开启集群的zk、hbase、hdfs、hive等服务;
  2. 进入hbase shell以及hive;
  3. 实战。
    如何将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';

Hive整合Hbase
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;

Hive整合HbaseHbase表添加数据,同步到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");