HBase集成Hive
Hive提供了与HBase的集成,使得能够在HBase表上使用hive sql 语句进行查询、插入操作以及进行Join和Union等复杂查询,同时也可以将hive表中的数据映射到Hbase中
1 HBase与Hive的对比
1.1 Hive
- 数据仓库管理系统
Hive的本质其实就相当于将HDFS中已经存储的文件在Mysql中做了一个双射关系,以方便使用HQL去管理查询。 - 用于数据分析、清洗
Hive适用于离线的数据分析和清洗,延迟较高 - 基于HDFS、MapReduce(或者其他计算引擎如:Tez、Spark)
Hive存储的数据依旧在DataNode上,编写的HQL语句终将是转换为MapReduce代码执行。(不要钻不需要执行MapReduce代码的情况的牛角尖)
1.2 HBase
- 数据库管理系统
是一种面向列存储的非关系型数据库。 - 用于存储结构化和非结构话的数据
适用于单表非关系型数据的存储,不适合做关联查询,类似JOIN等操作。 - 基于HDFS
数据持久化存储的体现形式是Hfile,存放于DataNode中,被ResionServer以region的形式进行管理。 - 延迟较低,接入在线业务使用
面对大量的企业数据,HBase可以直线单表大量数据的存储,同时提供了高效的数据访问速度。
1.3 总结:Hive与HBase
- Hive和Hbase是两种基于Hadoop的不同技术,Hive是一种类SQL的引擎,并且运行MapReduce任务,Hbase是一种在Hadoop之上的NoSQL 的Key/vale数据库。
这两种工具是可以同时使用的。就像用Google来搜索,用FaceBook进行社交一样,Hive可以用来进行统计查询,HBase可以用来进行实时查询,
数据也可以从Hive写到HBase,或者从HBase写回Hive。
我们来做2个小案例,Hive中表数据导入到Hbase中,Hbase中的表数据导入到Hive
注意:请确保安装Hadoop、zookeeper、hive、hbase、mysql,具体安装过程请查看其他博客文章
hadoop01 | hadoop02 | hadoop03 | |
---|---|---|---|
namenode | x | ||
secondnamenode | x | ||
datanode | x | x | x |
yarn | x | ||
zk | x | x | x |
Hive | x | ||
Hbase | x | ||
mysql | x |
Hive整合Hbase
1 拷贝jar包
- 将我们HBase的五个jar包拷贝到Hive的lib目录下
- Hbase的jar包都在/bigdata/install/hbase-2.2.6/lib
- 我们需要拷贝五个jar包名字如下
hbase-client-2.2.6.jar
hbase-hadoop2-compat-2.2.6.jar
hbase-hadoop-compat-2.2.6.jar
hbase-it-2.2.6.jar
hbase-server-2.2.6.jar
- 在hadoop02执行以下命令
cd /bigdata/install/hbase-2.2.6/lib
cp hbase-protocol-2.2.6.jar /bigdata/install/hive-3.1.2/lib/
cp hbase-server-2.2.6.jar /bigdata/install/hive-3.1.2/lib/
cp hbase-client-2.2.6.jar /bigdata/install/hive-3.1.2/lib/
cp hbase-common-2.2.6.jar /bigdata/install/hive-3.1.2/lib/
cp hbase-common-2.2.6-tests.jar /bigdata/install/hive-3.1.2/lib/
2 修改hive的配置文件
- 编辑hadoop02服务器上面的Hive的配置文件hive-site.xml
cd /bigdata/install/hive-3.1.2/conf
vim hive-site.xml
- 添加以下两个属性的配置
<property>
<name>hive.zookeeper.quorum</name>
<value>hadoop01,hadoop02,hadoop03</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>hadoop01,hadoop02,hadoop03</value>
</property>
3 修改hive-env.sh配置文件
cd /bigdata/install/hive-3.1.2/conf
cp hive-env.sh.template hive-env.sh
vim hive-env.sh
- 添加以下配置
export HADOOP_HOME=/bigdata/install/hadoop-3.1.4
export HBASE_HOME=/bigdata/install/hbase-2.2.2
export HIVE_CONF_DIR=/bigdata/install/hive-3.1.2/conf
Hive中表数据导入到Hbase
1 Hive当中建表
- hadoop02执行以下命令,进入Hive客户端,并创建Hive表
cd /bigdata/install/hive-3.1.2/
bin/hive
- 创建Hive数据库与Hive对应的数据库表
create database course;
use course;
create external table if not exists course.score(id int, cname string, score int)
row format delimited fields terminated by '\t' stored as textfile ;
2 准备数据内容如下并加载到Hive表
- hadoop02执行以下命令,创建数据文件
cd /bigdata/install/
mkdir docouments
cd /bigdata/install/docouments
vim hive-hbase.txt
- 文件内容如下
1 zhangsan 80
2 lisi 60
3 wangwu 30
4 zhaoliu 70
- 进入Hive客户端进行加载数据
hive (course)> load data local inpath '/bigdata/install/docouments/hive-hbase.txt' into table score;
hive (course)> select * from score;
3 创建Hive管理表与HBase进行映射
- 我们可以创建一个Hive的管理表与Hbase当中的表进行映射,Hive管理表当中的数据,都会存储到Hbase上面去
- Hive当中创建内部表
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");
- 通过insert overwrite select 插入数据
insert overwrite table course.hbase_score select id,cname,score from course.score;
4 Hbase当中查看表hbase_score
- 进入Hbase的客户端查看表hbase_score,并查看当中的数据
创建Hive外部表,映射HBase当中已有的表模型
1 HBase当中创建表并手动插入加载一些数据
- 进入HBase的shell客户端,
bin/hbase shell
- 手动创建一张表,并插入加载一些数据进去
# 创建一张表
# 通过put插入数据到hbase表
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'
- 查看以下HBase当中hbase_hive_score表的数据
2 建立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");
- 查看Hive表course.hbase2hive
select * from course.hbase2hive;