前言
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
- 数据仓库 Hive 的本质其实就相当于将 HDFS中已经存储的文件在 Mysql 中做了一个双射关系,以方便使用 HQL 去管理查询。
- 用于数据分析、清洗 Hive 适用于离线的数据分析和清洗,延迟较高。
- 基于 HDFS、MapReduce Hive 存储的数据依旧在 DataNode 上,编写的 HQL 语句终将是转换为 MapReduce 代码执行。
HBase
- 数据库 是一种面向列族存储的非关系型数据库。
- 用于存储结构化和非结构化的数据 适用于单表非关系型数据的存储,不适合做关联查询,类似 JOIN 等操作。
- 基于 HDFS 数据持久化存储的体现形式是 HFile,存放于 DataNode 中,被 ResionServer 以 region 的形式进行管理。
- 延迟较低,接入在线业务使用 面对大量的企业数据,HBase 可以直线单表大量数据的存储,同时提供了高效的数据访问速度。
Hive与Hbase集成
目标
在操作 Hive 的同时对HBase也会产生影响。
配置
编辑hive-site.xml
配置文件
添加hive.zookeeper.quorum, hbase.zookeeper.quorum属性
代码语言:javascript复制<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属性
这个如果配置过环境变量可以跳过
代码语言:javascript复制export HADOOP_HOME=/data/tools/bigdata/hadoop-2.7.7
export HBASE_HOME=/data/tools/bigdata/hbase-2.1.10
命令启动hive,如不报错表示hive与hbase整合成功
代码语言:javascript复制hive
hive数据自动导入hbase
目标:建立 Hive 表,关联 HBase 表,插入数据到 Hive 表的同时能够影响 HBase 表。
分步实现:
(1) 在 Hive 中创建表同时关联 HBase
代码语言:javascript复制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中执行
代码语言:javascript复制hive
show tables;
hbase中查看
代码语言:javascript复制hbase shell
list
scan 'hbase_tuser', {FORMATTER => 'toString'}
(2) 在 Hive 中创建临时中间表,用于 load 文件中的数据
提示:
不能将数据直接 load 进 Hive 所关联 HBase 的那张表中
Hive创建表
代码语言:javascript复制CREATE TABLE hive_tuser(
id string,
name string,
sex string
)
row format delimited fields terminated by 't';
(3) 向 Hive 中间表中 load 数据
/root/tuser.txt
代码语言:javascript复制1 zhagnsan 1
2 lisi 2
hive中导入
代码语言:javascript复制load data local inpath '/root/tuser.txt' into table hive_tuser;
select * from hive_tuser;
(4) 通过 insert 命令将中间表中的数据导入到 Hive 关联 Hbase 的那张表中
hive中执行
代码语言:javascript复制insert into table hive_hbase_tuser select * from hive_tuser;
(5) 查看 Hive 以及关联的 HBase 表中是否已经成功的同步插入了数据
Hive:
代码语言:javascript复制select * from hive_hbase_tuser;
HBase:
代码语言:javascript复制hbase shell
scan 'hbase_tuser', {FORMATTER => 'toString'}
hive中获取hbase数据
hbase中创建表
代码语言:javascript复制create 't_user', 'info'
put 't_user','1','info:name','xiaoming'
put 't_user','1','info:sex','man'
在hive中创建一张hbase与hive的映射表, 建表语句如下
代码语言:javascript复制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客户端查询该表的数据
代码语言:javascript复制select * from t_user;
结果
代码语言:javascript复制hive> select * from t_user;
OK
1 xiaoming man
Time taken: 2.172 seconds, Fetched: 1 row(s)
hbase中加一条数据
代码语言:javascript复制put 't_user','2','info:name','test'
put 't_user','2','info:sex','123456'
hive再次查询
代码语言:javascript复制select * from t_user;
结果
代码语言:javascript复制hive> select * from t_user;
OK
1 xiaoming man
2 test 123456
Time taken: 0.408 seconds, Fetched: 2 row(s)
至此,hive与hbase集成成功.