hbase与hive的对比
Hive | HBase |
---|---|
数据仓库 | 数据库 |
Hive的本质其实就相当于将HDFS中已经存储的文件在Mysql中做了一个双射关系,以方便使用HQL去管理查询。 | 是一种面向列存储的非关系型数据库。 |
用于数据分析、清洗 | 用于存储结构化和非结构话的数据 |
基于HDFS、MapReduce | 基于HDFS |
Hive适用于离线的数据分析和清洗,延迟较高 | 适用于单表非关系型数据的存储,不适合做关联查询,类似JOIN等操作,延迟较低,接入在线业务使用 |
Hive存储的数据依旧在DataNode上,编写的HQL语句终将是转换为MapReduce代码执行 | 数据持久化存储的体现形式是Hfile,存放于DataNode中,被ResionServer以region的形式进行管理。 |
总结:Hive与HBase
1、Hive和Hbase是两种基于Hadoop的不同技术,Hive是一种类SQL的引擎,并且运行MapReduce任务,Hbase是一种在Hadoop之上的NoSQL 的Key/vale数据库。这两种工具是可以同时使用的。就像用Google来搜索,用FaceBook进行社交一样,Hive可以用来进行统计查询,HBase可以用来进行实时查询,数据也可以从Hive写到HBase,或者从HBase写回Hive。
2、面对大量的企业数据,HBase可以直线单表大量数据的存储,同时提供了高效的数据访问速度。
hive与HBase的整合
hive与我们的HBase各有千秋,各自有着不同的功能,但是归根接地,hive与hbase的数据最终都是存储在hdfs上面的,一般的我们为了存储磁盘的空间,不会将一份数据存储到多个地方,导致磁盘空间的浪费,我们可以直接将数据存入hbase,然后通过hive整合hbase直接使用sql语句分析hbase里面的数据即可,非常方便
1.步骤
1、拷贝hbase的五个依赖jar包到hive的lib目录下
我的hive安装在node03机器上,所以在node03机器上执行
进入到hbase的jar包目录/export/servers/hbase-1.2.0-cdh5.14.0/lib
拷贝以下jar包到hive的lib目录下
hbase-client-1.2.0-cdh5.14.0.jar
hbase-hadoop2-compat-1.2.0-cdh5.14.0.jar
hbase-hadoop-compat-1.2.0-cdh5.14.0.jar
hbase-it-1.2.0-cdh5.14.0.jar
hbase-server-1.2.0-cdh5.14.0.jar
因为考虑到jar包版本的变化问题,这里采用软连接的方式拷贝
ln -s /export/servers/hbase-1.2.0-cdh5.14.0/lib/hbase-client-1.2.0-cdh5.14.0.jar /export/servers/hive-1.1.0-cdh5.14.0/lib/hbase-client-1.2.0-cdh5.14.0.jar
ln -s /export/servers/hbase-1.2.0-cdh5.14.0/lib/hbase-hadoop2-compat-1.2.0-cdh5.14.0.jar /export/servers/hive-1.1.0-cdh5.14.0/lib/hbase-hadoop2-compat-1.2.0-cdh5.14.0.jar
ln -s /export/servers/hbase-1.2.0-cdh5.14.0/lib/hbase-hadoop-compat-1.2.0-cdh5.14.0.jar /export/servers/hive-1.1.0-cdh5.14.0/lib/hbase-hadoop-compat-1.2.0-cdh5.14.0.jar
ln -s /export/servers/hbase-1.2.0-cdh5.14.0/lib/hbase-it-1.2.0-cdh5.14.0.jar /export/servers/hive-1.1.0-cdh5.14.0/lib/hbase-it-1.2.0-cdh5.14.0.jar
ln -s /export/servers/hbase-1.2.0-cdh5.14.0/lib/hbase-server-1.2.0-cdh5.14.0.jar /export/servers/hive-1.1.0-cdh5.14.0/lib/hbase-server-1.2.0-cdh5.14.0.jar
2、修改hive的配置文件
编辑node03服务器上面的hive的配置文件hive-site.xml添加以下两行配置
cd /export/servers/hive-1.1.0-cdh5.14.0/conf
vim hive-site.xml
<property>
<name>hive.zookeeper.quorum</name>
<value>node01,node02,node03</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>node01,node02,node03</value>
</property>
3、修改hive-env.sh配置文件添加以下配置
cd /export/servers/hive-1.1.0-cdh5.14.0/conf
vim hive-env.sh
export HADOOP_HOME=/export/servers/hadoop-2.6.0-cdh5.14.0
export HBASE_HOME=/export/servers/hbase-1.2.0-cdh5.14.0
export HIVE_CONF_DIR=/export/servers/hive-1.1.0-cdh5.14.0/conf
2.案例一:将hive分析结果的数据,保存到HBase当中去
1、创建hive管理表与HBase进行映射
我们可以创建一个hive的管理表与hbase当中的表进行映射,hive管理表当中的数据,都会存储到hbase上面去
hive当中创建内部表
关键字段:
存储者:stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
映射到hbase中的表字段(列族:列):with serdeproperties("hbase.columns.mapping" = "cf:name,cf:score")
hbase中的表名:tblproperties("hbase.table.name" = "hbase_score");
create table course.hbase_score(id int,cname string,score int)
stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
with serdeproperties("hbase.columns.mapping" = "cf:name,cf:score")
tblproperties("hbase.table.name" = "hbase_score");
2、插入数据
把提前创建好的表score的数据插入到hbase_score表
insert overwrite table course.hbase_score
(select id,cname,score
from course.score);
3、hbase当中查看表hbase_score
list
scan 'hbase_score'
3.案例二:创建hive外部表,映射HBase当中已有的表模型
1、HBase当中创建表并手动插入加载一些数据
进入HBase的shell客户端,手动创建一张表,并插入加载一些数据进去
create 'hbase_hive_score',{ NAME =>'cf'}
put 'hbase_hive_score','1','cf:name','zhangsan'
put 'hbase_hive_score','1','cf:score', '95'
put 'hbase_hive_score','2','cf:name','lisi'
put 'hbase_hive_score','2','cf:score', '96'
put 'hbase_hive_score','3','cf:name','wangwu'
put 'hbase_hive_score','3','cf:score', '97'
2、建立hive的外部表,映射HBase当中的表以及字段
注意: 在hive当中建立外部表,不能建立内部表,因为内部表与hbase对应
进入hive客户端,然后执行以下命令进行创建hive外部表,就可以实现映射HBase当中的表数据
CREATE external TABLE course.hbase2hive(
id int,
name string,
score int)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,cf:name,cf:score")
TBLPROPERTIES("hbase.table.name" ="hbase_hive_score");
3、查询
select * from hbase2hive limit 3;