大数据HBase学习之旅第三篇

973 阅读5分钟

「这是我参与11月更文挑战的第34天,活动详情查看:2021最后一次更文挑战」。

一、HBase 与 Hive 的集成

1.1、HBase 与 Hive 的对比

  1. Hive

    • 数据仓库

      Hive 的本质其实就相当于将 HDFS 中已经存储的文件在 Mysql 中做了一个双射关系,以方便使用 HQL 去管理查询。

    • 用于数据分析、清洗

      Hive 适用于离线的数据分析和清洗,延迟较高。

    • 基于 HDFS、MapReduce

      Hive 存储的数据依旧在 DataNode 上,编写的 HQL 语句终将是转换为 MapReduce 代码执行。

  2. 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新版本。

image.png

新版的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的信息。

image.png

高版本的官方统计表记录数是这个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包

image.png

image.png

然后,再打开 hive shell,执行相关的Hive SQL命令,会发现现在干干净净了。

07A90E98.gif

1.2.1、案例一

目标:建立 Hive 表,关联 HBase 表,插入数据到 Hive 表的同时能够影响 HBase 表。

分步实现:

  1. 在 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 查看,都生成了对应的表

    image.png

  2. 在 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';
    
  3. 向 Hive 中间表中 load 数据

    hive (default)> load data local inpath '/opt/module/hive-3.1.2/datas/emp.txt' into table emp;
    
  4. 通过 insert 命令将中间表中的数据导入到 Hive 关联 Hbase 的那张表中

    hive (default)> insert into table hive_hbase_emp_table select * from emp;
    

    提示:如果之前配置了hive的执行引擎为tez,则会报错!作者这里没有进一步研究!直接把之前在Hive中配置(hive-site.xml)的tez相关配置注重掉了!默认为MR。

    image.png

  5. 查看 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 这张表中的数据。

分步实现:

  1. 在 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");
    
  2. 关联后就可以使用 Hive 函数进行一些分析操作了

    hive (default)> select * from relevance_hbase_emp;
    

    image.png

  3. 在 HBase 中插入一条数据

    hbase(main):013:0> put 'hbase_emp_table','7935','info:ename','moe'
    
    hbase(main):014:0> scan 'hbase_emp_table'
    

    image.png

  4. 在 Hive 中进行查询

    hive (default)> select * from relevance_hbase_emp;
    

    image.png

二、友情链接

大数据HBase学习之旅第二篇

大数据HBase学习之旅第一篇