上篇文章我们讲述了HBase中的协处理器并通过一个简单的示例实现了数据同步插入的问题,本文我们来看一下HBase与Hive的集成。关注专栏《破茧成蝶——大数据篇》,查看更多相关的内容~
目录
一、HBase与Hive集成的必要性
Hive是建立在Hadoop之上的数据仓库基础构架、是为了减少MapReduce编写工作的批处理系统,Hive本身不存储和计算数据,它完全依赖于HDFS和MapReduce。Hive可以理解为一个客户端工具,将我们的sql操作转换为相应的MapReduce jobs,然后在Hadoop上面运行。HBase全称为Hadoop Database,即HBase是Hadoop的数据库,是一个分布式的存储系统。HBase利用Hadoop的HDFS作为其文件存储系统,利用Hadoop的MapReduce来处理HBase中的海量数据。利用Zookeeper作为其协调工具。 HBase数据库的缺点在于——语法格式异类,没有类sql的查询方式,因此在实际的业务当中操作和计算数据非常不方便,但是Hive就不一样了,Hive支持标准的sql语法,于是我们就希望通过Hive这个客户端工具对HBase中的数据进行操作与查询,进行相应的数据挖掘,这就是所谓HBase与Hive集成的含义。
二、HBase与Hive集成
2.1 jar包拷贝
因为HBase与Hive集成,后续Hive操作会对HBase的表产生影响,所以Hive需要拷贝操作HBase的jar包,所以我们使用软链接将jar包链接到Hive中,如下所示。
export HBASE_HOME=/opt/modules/hbase
export HIVE_HOME=/opt/modules/hive
ln -s $HBASE_HOME/lib/hbase-common-1.3.1.jar $HIVE_HOME/lib/hbase-common-1.3.1.jar
ln -s $HBASE_HOME/lib/hbase-server-1.3.1.jar $HIVE_HOME/lib/hbase-server-1.3.1.jar
ln -s $HBASE_HOME/lib/hbase-client-1.3.1.jar $HIVE_HOME/lib/hbase-client-1.3.1.jar
ln -s $HBASE_HOME/lib/hbase-protocol-1.3.1.jar $HIVE_HOME/lib/hbase-protocol-1.3.1.jar
ln -s $HBASE_HOME/lib/hbase-it-1.3.1.jar $HIVE_HOME/lib/hbase-it-1.3.1.jar
ln -s $HBASE_HOME/lib/htrace-core-3.1.0-incubating.jar $HIVE_HOME/lib/htrace-core-3.1.0-incubating.jar
ln -s $HBASE_HOME/lib/hbase-hadoop2-compat-1.3.1.jar $HIVE_HOME/lib/hbase-hadoop2-compat-1.3.1.jar
ln -s $HBASE_HOME/lib/hbase-hadoop-compat-1.3.1.jar $HIVE_HOME/lib/hbase-hadoop-compat-1.3.1.jar
2.2 修改配置文件
在hive-site.xml中添加如下配置:
<property>
<name>hive.zookeeper.quorum</name>
<value>master,slave01,slave02</value>
<description>The list of ZooKeeper servers to talk to. This is only needed for read/write locks.</description>
</property>
<property>
<name>hive.zookeeper.client.port</name>
<value>2181</value>
<description>The port of ZooKeeper servers to talk to. This is only needed for read/write locks.</description>
</property>
三、案例
3.1 案例一
3.1.1 需求说明
创建Hive表,同时关联HBase表,插入数据到Hive表的同时也可以在HBase中查看数据。
3.1.2 需求实现
1、创建Hive表,并同时关联HBase
CREATE TABLE hive_hbase_user(
id int,
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_hive_user");
创建成功后,可以分别在Hive和HBase中查看到表已经创建成功:
2、在Hive中创建中间表,用于load文件中的数据。这里需要注意的是,不能将数据直接load进Hive所关联HBase的那张表中。
CREATE TABLE user_tmp(
id int,
name string,
sex string)
row format delimited fields terminated by ',';
3、向中间表中导入数据
load data local inpath '/root/files/user_tmp.txt' into table user_tmp;
4、通过insert命令将中间表中的数据导入到Hive关联HBase的那张表中
insert into table hive_hbase_user select * from user_tmp;
5、查看Hive和HBase中是否已经导入了数据
select * from hive_hbase_user;
scan 'hbase_hive_user'
3.2 案例二
3.2.1 需求说明
在HBase中已经存在了某张表(hbase_hive_user,案例一中的表),在Hive中创建一个外部表来关联映射HBase中的这张表,实现使用Hive来分析HBase的表数据。
3.2.2 需求实现
1、新建Hive外部表映射HBase中的表
CREATE EXTERNAL TABLE hive_hbase_user_outer(
id int,
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_hive_user");
2、查询外部表进行数据分析
select * from hive_hbase_user_outer;
好了,本文到此已经全部结束。你们在这个过程中遇到了什么问题,欢迎留言,让我看看你们遇到了什么问题~