- 简介
Hive提供了与HBase的集成,使得能够在HBase表上使用HQL语句进行查询 插入操作以及进行Join和Union等复杂查询、
同时也可以将hive表中的数据映射到Hbase中。在工作中很常见。它的应用场景有很多,比如在Hadoop业务的开发流程如下:
其中在数据存入hbase—>Hive对数据进行统计分析的这个步骤中就涉及到了Hive与Hbase的整合,所以了解Hive与Hbase的整合是很有必要的。 - Hive与Hbase整合的必要性
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中的
数据进行操作与查询,进行相应的数据挖掘,这就是所谓Hive与hbase整合的含义。Hive与Hbase整合的示意图如下: - hive与hbase版本兼容性
Hive版本:1.2.1
Hbase版本:1.3.1
⑴hbase与hive哪些版本兼容?
a:hive0.90与hbase0.92是兼容的,早期的hive版本与hbase0.89/0.90兼容。
b:hive1.x与hbase0.98.x或则更低版本是兼容的。
c:hive2.x与hbase1.x及比hbase1.x更高版本兼容。
Hive 0.6.0推出了storage-handler,用于将数据存储到HDFS以外的其他存储上。并方便的通过hive进行插入、查询等操作。
同时hive提供了针对Hbase的hive-hbase-handler。这使我们在使用hive节省开发M/R代码成本的同时还能获得HBase的特性来快
速响应随机查询。
但是,hive自带的hive-hbase-handler是针对特定版本的Hbase的,比如,0.7.0版本的hive编译时使用的是0.89.0版本的Hbase,0.6.0版本的hive默认使用0.20.3版本的hbase进行编译。如果能够找到对应的版本,可以跳过编译的步骤直接使用。不过,我们现状已经找不到这些版本的Hbase与之配合使用了。所以只好自己来编译这个jar包。
注:使用不匹配的版本,一些功能会发生异常。其原因是由于没有重新编译storage-handler组件,发现在hive中查询HBase表存在问题。hive-hbase-handler.jar的作用在hbase与hive整合的时候发挥了重要作用,有了这个包,hbase与hive才能通信。
如果想hbase1.x与hive1.x整合,需要编译hive1.x 代码本身。 - 下面我们创建项目去编译源码
⑴首先我们需要去网上下载对应hive版本的源码包
解压后:
⑵在eclipse中创建一个项目。Java project即可。
⑶在创建好的项目上点击右键,选择Import,选择General下的FileSystem,
找到源码包apache-hive-1.2.1-src\hbase-handler\src\java目录选择其中的java目录导入
⑷添加依赖包,导入代码后可以看到很多的错误提示。这时由于没有引入依赖的jar包导致的。
下面,我们引入,需要hive、hbase下相关的lib包。新建lib目录,把对应的依赖包,导入
a:首先我们进入到hive的lib目录下,下载下来所有的jar,注意:文件夹不要,以及.pom文件不要。
b:我们再进入hbase的lib目录下,下载下来所有的jar,有相同的就去掉,注意:文件夹不要,以及.pom文件不要。
⑸至此可以导出我们需要的jar包了。在项目上点击右键,选择export ,选择JAR file
我们只编译源码,不要lib,名称就是我们要替换的原本的jar包名称hive-hbase-handler-1.2.1.jar
到这里我们就生成了符合自己Hbase版本的hive-hbase-handler了。 - 下面我们进入到hive的lib目录下删除原来的hive-hbase-handler-1.2.1.jar,换成我们自己的
- hive与hbase整合环境配置
⑴进入/usr/local/module/apache-hive-1.2.1/conf目录下修改hive-site.xml文件,添加配置属性(zookeeper的地址)
- 引入hbase的依赖包
⑴将hbase安装目录下的lib文件夹下的包导入到hive的环境变量中
a:在hive-env.sh 文件中添加
- 至此、hive与hbase整合环境准备完成
- 实战操作
⑴建立 Hive 表,关联 HBase 表,插入数据到 Hive 表的同时能够影响 HBase 表。
a:在 Hive 中创建表同时关联 HBase
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' //指定存储处理器CREATE TABLE hive_hbase_emp_table( empno int, ename string, job string, mgr int, hiredate string, sal double, comm double, deptno int ) STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,info:ename,info:job,info:mgr,info:hiredate,info:sal,info:comm,info:deptno") TBLPROPERTIES ("hbase.table.name" = "hbase_emp_table");
Hbase.table.name属性是可选的,用它来指定此表在hbase中的名字,这就是说,允许同一个表在hive和hbase中有不同的名字。
每个hive的列,都需要在参数hbase.columns.mapping中指定一个对应的条目,多个列之间的条目通过逗号分隔;也就是说,如果某个表有n个列,则参数hbase.columns.mapping的值中就有n个以逗号分隔的条目,比如:"hbase.columns.mapping" = ":key,a:b,a:c,d:e" 代表有两个列族,一个是a一个是d,a列族中有两列,分别为b和c 注意,hbase.columns.mapping的值中是不允许出现空格的 b:效果 c:现在我们需要向hive库中的hive_hbase_emp_table表中添加数据,注意:不能直接load数据到这张表中, 否则数据不会同步到hbase对应的hbase_emp_table表中。 在 Hive 中创建临时中间表,用于 load 文件中的数据
CREATE TABLE emp( empno int, ename string, job string, mgr int, hiredate string, sal double, comm double, deptno int ) row format delimited fields terminated by '\t';
d:向 Hive 中间表中 load 数据 e:通过 insert 命令将中间表中的数据导入到 Hive 关联 HBase 的那张表中 f:查看 Hive 以及关联的 HBase 表中是否已经成功的同步插入了数据 ⑵在 HBase 中已经存储了某一张表 hbase_emp_table,然后在 Hive 中创建一个外部表来关联 HBase 中的 hbase_emp_table 这张表,使之可以借助 Hive 来分析 HBase 这张表中的数据。 a:在 Hive 中创建外部表
CREATE EXTERNAL TABLE relevance_hbase_emp( empno int, ename string, job string, mgr int, hiredate string, sal double, comm double, deptno int ) STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,info:ename,info:job,info:mgr,info:hiredate,info:sal,info:comm,info:deptno") TBLPROPERTIES ("hbase.table.name" = "hbase_emp_table");
b:关联后就可以使用 Hive 函数进行一些分析操作了 ,数据自动填充进来 这里使用外部表映射到HBase中的表,这样,在Hive中删除表,并不会删除HBase中的表,否则,就会删除。
参考文章:
https://blog.csdn.net/linxiyimeng007/article/details/80969151
https://blog.csdn.net/a2011480169/article/details/51588253