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 
                     
    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");    
    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 文件中的数据 
    
    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        

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值