Hive中的表是纯逻辑表,就只是表的定义等,即表的元数据。Hive本身不存储数据,它完全依赖HDFS和MapReduce。这样就可以将结构化的数据文件映射为为一张数据库表,并提供完整的SQL查询功能,并将SQL语句最终转换为MapReduce任务进行运行。而HBase表是物理表,适合存放非结构化的数据。
Hive是基于MapReduce来处理数据,而MapReduce处理数据是基于行的模式;HBase处理数据是基于列的而不是基于行的模式,适合海量数据的随机访问。
HBase的表是疏松的存储的,因此用户可以给行定义各种不同的列;而Hive表是稠密型,即定义多少列,每一行有存储固定列数的数据。
Hive使用Hadoop来分析处理数据,而Hadoop系统是批处理系统,因此不能保证处理的低迟延问题;而HBase是近实时系统,支持实时查询。
在大数据架构中,Hive和HBase是协作关系,在数据引入到数据存储上密切配合,共同完成任务。
通过ETL工具将数据源抽取到HDFS存储;
通过Hive清洗、处理和计算原始数据;
HIve清洗处理后的结果,如果是面向海量数据随机查询场景的可存入Hbase;
数据应用从HBase查询数据。
目标
在操作 Hive 的同时对HBase也会产生影响。
编辑hive-site.xml
配置文件
添加hive.zookeeper.quorum, hbase.zookeeper.quorum属性
<property>
<name>hive.zookeeper.quorum</name>
<value>hadoop01,hadoop02,hadoop03</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>hadoop01,hadoop02,hadoop03</value>
</property>
编辑hive-env.sh文件
添加HADOOP_HOME, HBASE_HOME属性
这个如果配置过环境变量可以跳过
export HADOOP_HOME=/data/tools/bigdata/hadoop-2.7.7
export HBASE_HOME=/data/tools/bigdata/hbase-2.1.10
命令启动hive,如不报错表示hive与hbase整合成功
hive
目标:建立 Hive 表,关联 HBase 表,插入数据到 Hive 表的同时能够影响 HBase 表。
分步实现:
(1) 在 Hive 中创建表同时关联 HBase
CREATE TABLE hive_hbase_tuser(
id string,
name string,
sex string
)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,info:name,info:sex")
TBLPROPERTIES ("hbase.table.name" = "hbase_tuser");
提示:完成之后,可以分别进入 Hive 和 HBase 查看,都生成了对应的表
hive中执行
hive
show tables;
hbase中查看
hbase shell
list
scan 'hbase_tuser', {FORMATTER => 'toString'}
(2) 在 Hive 中创建临时中间表,用于 load 文件中的数据
提示:
不能将数据直接 load 进 Hive 所关联 HBase 的那张表中
Hive创建表
CREATE TABLE hive_tuser(
id string,
name string,
sex string
)
row format delimited fields terminated by '\t';
(3) 向 Hive 中间表中 load 数据
/root/tuser.txt
1 zhagnsan 1
2 lisi 2
hive中导入
load data local inpath '/root/tuser.txt' into table hive_tuser;
select * from hive_tuser;
(4) 通过 insert 命令将中间表中的数据导入到 Hive 关联 Hbase 的那张表中
hive中执行
insert into table hive_hbase_tuser select * from hive_tuser;
(5) 查看 Hive 以及关联的 HBase 表中是否已经成功的同步插入了数据
Hive:
select * from hive_hbase_tuser;
HBase:
hbase shell
scan 'hbase_tuser', {FORMATTER => 'toString'}
hbase中创建表
create 't_user', 'info'
put 't_user','1','info:name','xiaoming'
put 't_user','1','info:sex','man'
在hive中创建一张hbase与hive的映射表, 建表语句如下
create external table t_user (
id string,
name string,
sex string
)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,info:name,info:sex")
TBLPROPERTIES("hbase.table.name" = "t_user")
通过hive客户端查询该表的数据
select * from t_user;
结果
hive> select * from t_user;
OK
1 xiaoming man
Time taken: 2.172 seconds, Fetched: 1 row(s)
hbase中加一条数据
put 't_user','2','info:name','test'
put 't_user','2','info:sex','123456'
hive再次查询
select * from t_user;
结果
hive> select * from t_user;
OK
1 xiaoming man
2 test 123456
Time taken: 0.408 seconds, Fetched: 2 row(s)
至此,hive与hbase集成成功.