「这是我参与11月更文挑战的第34天,活动详情查看:2021最后一次更文挑战」。
一、HBase 与 Hive 的集成
1.1、HBase 与 Hive 的对比
-
Hive
-
数据仓库
Hive 的本质其实就相当于将 HDFS 中已经存储的文件在 Mysql 中做了一个双射关系,以方便使用 HQL 去管理查询。
-
用于数据分析、清洗
Hive 适用于离线的数据分析和清洗,延迟较高。
-
基于 HDFS、MapReduce
Hive 存储的数据依旧在 DataNode 上,编写的 HQL 语句终将是转换为 MapReduce 代码执行。
-
-
HBase
-
数据库
是一种面向列族存储的非关系型数据库。
-
用于存储结构化和非结构化的数据
适用于单表非关系型数据的存储,不适合做关联查询,类似 JOIN 等操作。
-
基于 HDFS
数据持久化存储的体现形式是 HFile,存放于 DataNode 中,被 ResionServer 以 region 的形式进行管理。
-
延迟较低,接入在线业务使用
面对大量的企业数据,HBase 可以直线单表大量数据的存储,同时提供了高效的数据访问速度。
-
1.2、HBase 与 Hive 集成使用
环境准备:关于HBase与Hive的版本兼容问题,让人尖叫!!!果然收费版的CDH帮我们解决的这个蛋疼的兼容性问题!不过咱也能解决哈!
友情提示:HBase前两篇文章都是基于hbase-1.3.1-bin.tar.gz这个版本,之前的Hive版本是apache-hive-3.1.2-bin.tar.gz,Hadoop版本是hadoop-3.1.3.tar.gz,之前的HBase做练习没太注意这个低版本与Hadoop、Hive版本兼容性问题,在做HBase与hive集成的时候出现了问题,满是眼泪!!!
作者使用的集群版本统计如下:
- Hadoop:hadoop-3.1.3.tar.gz
- Hive:apache-hive-3.1.2-bin.tar.gz
- HBase:hbase-2.2.4-bin.tar.gz
为什么使用HBase 2.2.4这个版本,是因为apache-hive-3.1.2-bin.tar.gz这个版本的Hive lib目录下有关于HBase的版本就是2.2.4,无奈把之前HBase低版本删掉,重新配置了HBase新版本。
新版的HBase(具体在哪个版本开始没具体查阅)需要在hbase-site.xml中新增如下配置:
<property>
<name>hbase.unsafe.stream.capability.enforce</name>
<value>false</value>
</property>
<property>
<name>hbase.wal.provider</name>
<value>filesystem</value>
</property>
新版本的HBase安装后,hbase shell进入后,创建表或查询表可能会报错,原因是之前安装过老版本的HBase,信息会记录在Zookeeper上,进入zk客户端,删除对应的旧版本的HBase信息,重新启动即可!
当安装HBase后,使用Hive时出现大量的INFO日志,简单的查表操作也打印大量日志,很是心烦!!!,关于这个,没安装HBase时,单独使用Hive时,没有这种情况出现,不知道大家在学习Hive的时候有没有注意,当进入Hive客户端时,第一行日志就打印了关于HBase的信息。
高版本的官方统计表记录数是这个jar包:hbase-mapreduce-2.2.4.jar,而不再是hbase-server-2.2.4.jar
[moe@hadoop102 hbase]$ /opt/module/hadoop-3.1.3/bin/yarn jar lib/hbase-mapreduce-2.2.4.jar rowcounter stu1
/opt/module/hadoop-3.1.3/bin/yarn jar lib/hbase-mapreduce-2.2.4.jar importtsv -Dimporttsv.columns=HBASE_ROW_KEY,info:name,info:color fruit hdfs://hadoop102:8020/fruit.tsv
在使用了HBase后,再次进入Hive后就出现大量的日志,基本上是大数据框架在使用时关于日志版本参差不齐导致的!!!解决办法把HBase lib目录下的关于log的jar包删除掉即可,网上也有关于修改Hive的日志级别,不过这个没有实验成功!!!
操作如下:删除相关日志jar包
然后,再打开 hive shell,执行相关的Hive SQL命令,会发现现在干干净净了。
1.2.1、案例一
目标:建立 Hive 表,关联 HBase 表,插入数据到 Hive 表的同时能够影响 HBase 表。
分步实现:
-
在 Hive 中创建表同时关联 HBase
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");提示:完成之后,可以分别进入 Hive 和 HBase 查看,都生成了对应的表
-
在 Hive 中创建临时中间表,用于 load 文件中的数据
提示:不能将数据直接 load 进 Hive 所关联 HBase 的那张表中
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'; -
向 Hive 中间表中 load 数据
hive (default)> load data local inpath '/opt/module/hive-3.1.2/datas/emp.txt' into table emp; -
通过 insert 命令将中间表中的数据导入到 Hive 关联 Hbase 的那张表中
hive (default)> insert into table hive_hbase_emp_table select * from emp;提示:如果之前配置了hive的执行引擎为tez,则会报错!作者这里没有进一步研究!直接把之前在Hive中配置(hive-site.xml)的tez相关配置注重掉了!默认为MR。
-
查看 Hive 以及关联的 HBase 表中是否已经成功的同步插入了数据
hive (default)> select * from hive_hbase_emp_table;hbase(main):012:0> scan 'hbase_emp_table'
1.2.2、案例二
目标:在 HBase 中已经存储了某一张表 hbase_emp_table,然后在 Hive 中创建一个外部表来关联 HBase 中的 hbase_emp_table 这张表,使之可以借助 Hive 来分析 HBase 这张表中的数据。
分步实现:
-
在 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"); -
关联后就可以使用 Hive 函数进行一些分析操作了
hive (default)> select * from relevance_hbase_emp; -
在 HBase 中插入一条数据
hbase(main):013:0> put 'hbase_emp_table','7935','info:ename','moe' hbase(main):014:0> scan 'hbase_emp_table' -
在 Hive 中进行查询
hive (default)> select * from relevance_hbase_emp;