Hive和Hbase集成及互相操作

前言

Hive和Hbase底层对比

Hive中的表是纯逻辑表,就只是表的定义等,即表的元数据。Hive本身不存储数据,它完全依赖HDFS和MapReduce。这样就可以将结构化的数据文件映射为为一张数据库表,并提供完整的SQL查询功能,并将SQL语句最终转换为MapReduce任务进行运行。而HBase表是物理表,适合存放非结构化的数据。

Hive是基于MapReduce来处理数据,而MapReduce处理数据是基于行的模式;HBase处理数据是基于列的而不是基于行的模式,适合海量数据的随机访问。

HBase的表是疏松的存储的,因此用户可以给行定义各种不同的列;而Hive表是稠密型,即定义多少列,每一行有存储固定列数的数据。

Hive使用Hadoop来分析处理数据,而Hadoop系统是批处理系统,因此不能保证处理的低迟延问题;而HBase是近实时系统,支持实时查询。

Hive和Hbase关系

在大数据架构中,Hive和HBase是协作关系,在数据引入到数据存储上密切配合,共同完成任务。

通过ETL工具将数据源抽取到HDFS存储;

通过Hive清洗、处理和计算原始数据;

HIve清洗处理后的结果,如果是面向海量数据随机查询场景的可存入Hbase;

数据应用从HBase查询数据。

Hive和Hbase对比

Hive

  1. 数据仓库
    Hive 的本质其实就相当于将 HDFS中已经存储的文件在 Mysql 中做了一个双射关系,以方便使用 HQL 去管理查询。

  2. 用于数据分析、清洗

    Hive 适用于离线的数据分析和清洗,延迟较高。

  3. 基于 HDFS、MapReduce
    Hive 存储的数据依旧在 DataNode 上,编写的 HQL 语句终将是转换为 MapReduce 代码执行。

HBase

  1. 数据库

    是一种面向列族存储的非关系型数据库。

  2. 用于存储结构化和非结构化的数据
    适用于单表非关系型数据的存储,不适合做关联查询,类似 JOIN 等操作。

  3. 基于 HDFS
    数据持久化存储的体现形式是 HFile,存放于 DataNode 中,被 ResionServer 以 region 的形式进行管理。

  4. 延迟较低,接入在线业务使用
    面对大量的企业数据,HBase 可以直线单表大量数据的存储,同时提供了高效的数据访问速度。

Hive与Hbase集成

目标

在操作 Hive 的同时对HBase也会产生影响。

配置

编辑hive-site.xml配置文件

添加hive.zookeeper.quorum, hbase.zookeeper.quorum属性

1
2
3
4
5
6
7
8
<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属性

这个如果配置过环境变量可以跳过

1
2
export HADOOP_HOME=/data/tools/bigdata/hadoop-2.7.7
export HBASE_HOME=/data/tools/bigdata/hbase-2.1.10

命令启动hive,如不报错表示hive与hbase整合成功

1
hive

hive数据自动导入hbase

目标:建立 Hive 表,关联 HBase 表,插入数据到 Hive 表的同时能够影响 HBase 表。

分步实现:

(1) 在 Hive 中创建表同时关联 HBase

1
2
3
4
5
6
7
8
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中执行

1
2
hive
show tables;

hbase中查看

1
2
3
hbase shell
list
scan 'hbase_tuser', {FORMATTER => 'toString'}

(2) 在 Hive 中创建临时中间表,用于 load 文件中的数据

提示:

不能将数据直接 load 进 Hive 所关联 HBase 的那张表中

Hive创建表

1
2
3
4
5
6
CREATE TABLE hive_tuser( 
id string,
name string,
sex string
)
row format delimited fields terminated by '\t';

(3) 向 Hive 中间表中 load 数据

/root/tuser.txt

1
2
1	zhagnsan	1
2 lisi 2

hive中导入

1
2
load data local inpath '/root/tuser.txt' into table hive_tuser;
select * from hive_tuser;

(4) 通过 insert 命令将中间表中的数据导入到 Hive 关联 Hbase 的那张表中

hive中执行

1
insert into table hive_hbase_tuser select * from hive_tuser;

(5) 查看 Hive 以及关联的 HBase 表中是否已经成功的同步插入了数据

Hive:

1
select * from hive_hbase_tuser;

HBase:

1
2
hbase shell
scan 'hbase_tuser', {FORMATTER => 'toString'}

hive中获取hbase数据

hbase中创建表

1
2
3
create 't_user', 'info'
put 't_user','1','info:name','xiaoming'
put 't_user','1','info:sex','man'

在hive中创建一张hbase与hive的映射表, 建表语句如下

1
2
3
4
5
6
7
8
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客户端查询该表的数据

1
select * from t_user;

结果

1
2
3
4
hive> select * from t_user;
OK
1 xiaoming man
Time taken: 2.172 seconds, Fetched: 1 row(s)

hbase中加一条数据

1
2
put 't_user','2','info:name','test'
put 't_user','2','info:sex','123456'

hive再次查询

1
select * from t_user;

结果

1
2
3
4
5
hive> select * from t_user;
OK
1 xiaoming man
2 test 123456
Time taken: 0.408 seconds, Fetched: 2 row(s)

至此,hive与hbase集成成功.