当前位置:   article > 正文

Hive整合Hbase详解_hive 配置hbase

hive 配置hbase
  1. 简介
        Hive提供了与HBase的集成,使得能够在HBase表上使用HQL语句进行查询 插入操作以及进行Join和Union等复杂查询、
    同时也可以将hive表中的数据映射到Hbase中。在工作中很常见。它的应用场景有很多,比如在Hadoop业务的开发流程如下:

    其中在数据存入hbase—>Hive对数据进行统计分析的这个步骤中就涉及到了Hive与Hbase的整合,所以了解Hive与Hbase的整合是很有必要的。 
  2. 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整合的示意图如下:
  3. 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 代码本身。
  4. 下面我们创建项目去编译源码
     
    ⑴首先我们需要去网上下载对应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了。
  5. 下面我们进入到hive的lib目录下删除原来的hive-hbase-handler-1.2.1.jar,换成我们自己的
      
  6. hive与hbase整合环境配置
     ⑴
    进入/usr/local/module/apache-hive-1.2.1/conf目录下修改hive-site.xml文件,添加配置属性(zookeeper的地址)
           
  7. 引入hbase的依赖包
     ⑴将hbase安装目录下的lib文件夹下的包导入到hive的环境变量中
           a:在hive-env.sh 文件中添加
                
  8. 至此、hive与hbase整合环境准备完成
  9. 实战操作
    建立 Hive 表,关联 HBase 表,插入数据到 Hive 表的同时能够影响 HBase 表。 
          a:在 Hive 中创建表同时关联 HBase 
                     
    1. CREATE TABLE hive_hbase_emp_table(
    2. empno int,
    3. ename string,
    4. job string,
    5. mgr int,
    6. hiredate string,
    7. sal double,
    8. comm double,
    9. deptno int
    10. )
    11. STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
    12. WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,info:ename,info:job,info:mgr,info:hiredate,info:sal,info:comm,info:deptno")
    13. TBLPROPERTIES ("hbase.table.name" = "hbase_emp_table");
    STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'  //指定存储处理器
    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 文件中的数据 
    
    1. CREATE TABLE emp(
    2. empno int,
    3. ename string,
    4. job string,
    5. mgr int,
    6. hiredate string,
    7. sal double,
    8. comm double,
    9. deptno int
    10. )
    11. 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 中创建外部表 
    
    1. CREATE EXTERNAL TABLE relevance_hbase_emp(
    2. empno int,
    3. ename string,
    4. job string,
    5. mgr int,
    6. hiredate string,
    7. sal double,
    8. comm double,
    9. deptno int
    10. )
    11. STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
    12. WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,info:ename,info:job,info:mgr,info:hiredate,info:sal,info:comm,info:deptno")
    13. 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        

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/413005?site
推荐阅读
相关标签
  

闽ICP备14008679号