hive与hbase关系整合

大大的橙子 大大的橙子     2022-08-29     635

关键词:

近期工作用到了HiveHbase的关系整合,虽然从网上参考了很多的资料,但是大多数讲的都不是很细,于是决定将这块知识点好好总结一下供大家分享,共同掌握! 
本篇文章在具体介绍Hive与Hbase整合之前,先给大家用一个流程图介绍Hadoop业务的开发流程以及Hive与Hbase的整合在业务当中的必要性。 
技术分享 
其中在数据存入hbase—>Hive对数据进行统计分析的这个步骤中就涉及到了Hive与Hbase的整合,所以了解Hive与Hbase的整合是很有必要的。 
1、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整合的示意图如下: 
技术分享 
2、Hive与Hbase整合—-Hive绑定Hbase中的table 
在Hive与Hbase整合的过程中,核心的步骤就是通过Hive绑定Hbase中的table表,绑定完之后,我们就可以通过Hive这个客户端工具对Hbase中的表进行查询了,那么如何进行绑定呢?—-关键在于Hbase中的table如何和hive中建立的table在column级别上建立映射关系。 
假设现在在Hbase中有一张表:hbasetable,其数据模型如下: 
技术分享 
对于这张表hbasetable,我们在Hive中建立的对应的数据模型如下: 
技术分享 
其实从两者的数据模型上来看建立column上的映射关系应该不是一件很难的事情,事实上确实不是很难,相应语法如下:

create external table hivetable(rowkey string, column1 string,column2 string,column3 string)   
stored by ‘org.apache.hadoop.hive.hbase.HBaseStorageHandler‘   
with serdeproperties("hbase.columns.mapping" = ":key,columnfamily1:column1,columnfamily1:column2,columnfamily2:column3")  
tblproperties("hbase.table.name"="hbasetable");   
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

语法具体含义: 
上面这个建表语句表示在Hive中建立一个外部表—名字叫做hivetable,与其在Hbase中建立映射关系的表名字为hbasetable,映射关系如下: 
hivetable —————————————hbasetable 
rowkey<—————>key (Hive中的rowkey字段关联到Hbase中的行健key) 
column1<————–>columnfamily1:column1 (hivetable中的column1映射到hbasetable中columnfamily1上的column1字段) 
column2<————–>columnfamily1:column2 (hivetable中的column2映射到hbasetable中columnfamily1上的column2字段) 
column3<————–>columnfamily2:column3 (hivetable中的column3映射到hbasetable中columnfamily2上的column3字段) 
stored by ‘org.apache.hadoop.hive.hbase.HBaseStorageHandler’ 的含义是:Hive与Hbase整合功能(互相通信)的实现主要是通过hive_hbase-handler.jar这个工具类来完成的,而语法中的HBaseStorageHandler指的就是这个工具类。

技术分享


下面用一个具体的实例来说明如何通过Hive来绑定Hbase中的table: 
首先我们先在Hbase中建立一个表:customer–其数据模型以及内容如下: 
技术分享 
创建完表之后核实一下customer表中的内容,看是否创建成功:

hbase(main):001:0> scan ‘customer‘
ROW                            COLUMN+CELL
 xiaoming                      column=address:city, timestamp=1465142056815, value=hangzhou
 xiaoming                      column=address:country, timestamp=1465142078267, value=china
 xiaoming                      column=address:province, timestamp=1465142041784, value=zhejiang
 xiaoming                      column=info:age, timestamp=1465142102017, value=24
 xiaoming                      column=info:company, timestamp=1465142114558, value=baidu
 zhangyifei                    column=address:city, timestamp=1465142154995, value=shenzhen
 zhangyifei                    column=address:country, timestamp=1465142167587, value=china
 zhangyifei                    column=address:province, timestamp=1465142138872, value=guangdong
 zhangyifei                    column=info:age, timestamp=1465142183538, value=28
 zhangyifei                    column=info:company, timestamp=1465142200569, value=alibaba
2 row(s) in 0.7090 seconds
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

接着我们根据上面的语法在hive中建立对应的表hive_customer,语法实现如下:

hive>  create external table hive_customer(rowkey string, city string,country string,province string,age string,company string)
    >  stored by ‘org.apache.hadoop.hive.hbase.HBaseStorageHandler‘
    >  with serdeproperties("hbase.columns.mapping" = ":key,address:city,address:country,address:province,info:age,info:company")
    >  tblproperties("hbase.table.name"="customer");
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

通过上面的语法我们就可以在hive中建立对应的表hive_customer了,现在我们查看一下表结构:

hive> describe hive_customer;
OK
rowkey  string  from deserializer
city    string  from deserializer
country string  from deserializer
province        string  from deserializer
age     string  from deserializer
company string  from deserializer
Time taken: 0.068 seconds
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

即: 
技术分享 
从上面的这个表结构可以看出,在hive表与hbase表整合的过程中,无非就是建立一个映射关系而已。 
现在我们在hive中查看一下hive_customer表的内容: 
技术分享 
很明显,hive中表的内容和我们预期想的是一样的,上面这个sql操作由于是全表操作,并没有走MapReduce程序,下面我们实现一个走MapReduce程序的sql操作: 
查询hive_customer表中xiaoming的相关信息: 
执行操作:

hive> select * from hive_customer
    > where rowkey="xiaoming";
  • 1
  • 2
  • 1
  • 2

然而hive的运行结果并没有我们像的这么顺利,抛出了下面的异常: 
技术分享 
这是为什么呢?—其实对于这个问题也是一个经验的总结,下面将进入我们博客的第三个部分。 
3、如何处理异常—–从而使hive与hbase能够顺利的进行相互访问 
有必要先介绍一下本次实验的运行环境: 
hadoop-1.1.2 (单点部署) 
hbase-0.94.7-security (单点部署) 
hive-0.9.0 (MetaStore 配置为MySQL数据库) 
注:下面的方法对于集群来说同样适用! 
解决步骤: 
①查看异常中的路径(即异常的URL地址)

http://hadoop80:50060/tasklog?taskid=attempt_201606042144_0002_m_000000_3&start=-8193   
将其修改为:
http://hadoop80:50060/tasklog?
attemptid=attempt_201606042144_0002_m_000000_3&start=-8193
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

然后在网页中查看异常的具体情况: 
技术分享 
②从页面的提示:Caused by: Java.lang.ClassNotFoundException: org.apache.hadoop.hive.hbase.HBaseSplit 可以看出明显是缺少某个jar包,这个jar包到底是什么呢? 
③这几个jar包分别是:

zookeeper-3.4.5.jar
hbase-0.94.7-security.jar
hbase-0.94.7-security-tests.jar
protobuf-java-2.4.0a.jar
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

注意:上面这几个jar包指的是hbase(hbase-0.94.7-security )本身自带的几个jar包,然后将这4个jar包拷贝到hive/lib的目录下(注意:如果在hive/lib的目录下已经存在这几个文件的其他版本(例如hbase-0.92.0.jar、hbase-0.92.0-tests.jar、zookeeper-3.4.3.jar—先将hive自带的这几个版本删除掉,然后在拷贝hbase下的相关版本) 
④在hive/conf的hive-site.xml文件中,添加如下内容:

<property>  
  <name>hive.aux.jars.path</name>   
  <value>file:///usr/local/hive/lib/zookeeper-3.4.5.jar,file:///usr/local/hive/lib/hbase-0.94.7-security.jar,file:///usr/local/hive/lib/hbase-0.94.7-security-tests.jar,file:///usr/local/hive/lib/protobuf-java-2.4.0a.jar,file:///usr/local/hive/lib/hive-hbase-handler-0.9.0.jar</value>  
</property>
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

注意:通过上面的这几行配置文件,可以加载Hive默认没有加载的这4个jar包(zookeeper-3.4.5.jar、 
hbase-0.94.7-security.jar、hbase-0.94.7-security-tests.jar、protobuf-java-2.4.0a.jar),但是在这里我有一点一直没有搞懂:hive-hbase-handler-0.9.0.jar这个jar包在hive中默认已经添加了,但是我们在编写配置文件的时候还必须写上,否则业务开发中就会出错–如果有知道这个原因的博友,欢迎留言。 
⑤拷贝zookeeper-3.4.5.jar、hbase-0.94.7-security.jar、hbase-0.94.7-security-tests.jar、protobuf-java-2.4.0a.jar这四个jar包到所有hadoop节点的lib目录下(我本次实验的时候用的是单点,所以就拷贝一个)。 
⑥拷贝hbase/conf下的hbase-site.xml文件到所有hadoop节点conf目录下。 
⑦重启hadoop、hbase、hive。 
经过上面7个详细的步骤,这个异常问题我们就彻底解决了,下面我们在重新执行一下业务: 
查询hive_customer表中xiaoming的相关信息: 
操作: 
技术分享 
OK!到这里我们就顺利的获取到了我们希望的结果了!

hive教程---整合hbase

...实就相当于将HDFS中已经存储的文件在Mysql中做了一个双射关系,以方便使用HQL去管理查询。(2)用于数据分析、清洗Hive适用于离线的数据分析和清洗,延迟较高。(3)基于HDFS、MapReduceHive存储的数据依旧在DataNode上, 查看详情

hive与hbase整合(代码片段)

Hive与Hbase整合1.文档  HiveHBaseIntegration 2.拷贝jar文件2.1.把Hbase的lib目录下面的jar文件全部拷贝到Hive的lib目录下面cd/home/hbase/libcp./*/home/hive/lib 2.2.把Hive的lib目录下面的hive-hbase-handler-0.13.1.jar拷贝到Hbase的lib目录下面cp/home/hiv... 查看详情

hbase_hive整合

Hive与HBase的整合功能的实现是利用两者本身对外的API接口互相进行通信,相互通信主要是依靠hive_hbase-handler.jar工具类首先保证版本一致cd/home/hadoop/hive-1.1.0-cdh5.5.2/lib查看版本是否一致hbase-server-1.0.0-cdh5.5.2.jar zookeeper-3.4.5-cdh5.5.... 查看详情

hive整合hbase

...源?? ??2.3构建低延时的数据仓库 环境准备????3.1hive与hbase整合环境配置修改hive-site.xml文件,添加配置属性(zookeeper的地址)[root@hadoop01conf]#vimhive-site.xml <property> <name>hbase.zookeeper.quorum</name> <value&... 查看详情

hadoop基础之《—整合hbase+phoenix+hive》

...据存储的,一种分布式、可扩展的NoSQL数据库(非关系型,以k,v的形式存储数据)。HBase可以认为是以HDFS为存储的数据库。2、HBase数据模型(1)HBase的设计理念依据Google的BigTable论文,论文中对于数据模... 查看详情

hive和hbase有啥关系和区别

应该是Hadoop在hbase和Hive中的作用吧。hbase与hive都是架构在hadoop之上的。都是用hadoop作为底层存储。而hbase是作为分布式数据库,而hive是作为分布式数据仓库。当然hive还是借用hadoop的MapReduce来完成一些hive中的命令的执行。而hbase... 查看详情

hbase与hive集成(代码片段)

...Hive的本质是将HDFS已经存储的文件在MySQL中做了一个双射关系,以方便使用HiveQL管理查询用于数据分析、清洗,Hive适用于离线的数据分析和清洗HBase数据库,面向列族存储的非关系型数据库用于存储结构化和非结构化的数据,不... 查看详情

hbase与hive(代码片段)

...实就相当于将hdfs中已经存储的文件在Mysql中做了一个双射关系,以方便用HQL去管理查询。用于数据分析、清洗:Hive适用于离线的数据分析和清洗,延迟较高。基于HDFS、MapReduce:Hive存储的数据依旧在DataNode上,编写的HQL语句终将... 查看详情

spark:spark-sql读hbase

    SparkSQL是指整合了Hive的spark-sqlcli,本质上就是通过Hive访问HBase表,具体就是通过hive-hbase-handler,具体配置参见:Hive(五):hive与hbase整合 目录:SparkSql访问hbase配置测试验证SparkSql访问hbase配置: 拷贝HBase的相关j... 查看详情

hive是啥,hive与关系型数据库的区别

...同应用场景吧,HBase速度比Hive快了不知道多少。HBase是非关系型数据库(KV型),对key做索引,查询速度非常快(相比较Hive),适合实时查询;而Hive是关系型数据结构,适合做后期数据分析。和单机的MySQL,Oracle比较的话,Hive的... 查看详情

建立hive和hbase的映射关系,通过spark将hive表中数据导入clickhouse(代码片段)

...rk+ClickHouse​在HBase中建表,通过Hive与HBase建立映射关系,实现双方新增数据后彼此都可以查询到。通过spark将Hive中的数据读取到并经过处理保存到ClickHouse中一Hbase1Hbase表操作1.1创建命名空间hbase(main):008:0>create_namespace 查看详情

hdfs,mapreduce,hive,hbase等之间的关系

   HDFS:HDFS是GFS的一种实现,他的完整名字是分布式文件系统,类似于FAT32,NTFS,是一种文件格式,是底层的。Hive与Hbase的数据一般都存储在HDFS上。HadoopHDFS为他们提供了高可靠性的底层存储支持。 Hive:Hive不支持... 查看详情

hive与hbase的区别与联系

...题,一般是配合使用。在大数据架构中,Hive和HBase是协作关系,数据流一般如下图:通过ETL工具将数据源抽取到HDFS存储;通过Hive清洗、处理和计算原始数据;HIve清洗处理后的结果,如果是面向海量数据随机查询场景的可存入Hba... 查看详情

hive是啥,hive与关系型数据库的区别

Hive与传统的关系型数据库有很多类似的地方,例如对SQL的支持。但是其基于HDFS与MapReduce的事实使得它与传统的数据库在很多方面有很大的不同,在一些特性的支持下也受到底层架构的限制,但是这些限制随着版本迭代正在不断... 查看详情

hbase可以访问hive里面的表吗

参考技术A使用hive-hbase-handler,通过在Hive中建立外部表可以映射到HBase中的表,然后在Hive中往外部表中INSERT数据,即可完成对HBase表的数据插入。你可以搜索"lxw的大数据田地"查看Hive与HBase整合的相关文章。 查看详情

hadoophdfshivehbase之间的关系

Hadoop:是一个分布式计算的开源框架HDFS:是Hadoop的三大核心组件之一Hive:用户处理存储在HDFS中的数据,hive的意义就是把好写的hive的sql转换为复杂难写的map-reduce程序Hbase:是一款基于HDFS的数据库,是一种NoSQL数据库,主要适用... 查看详情

hive与hbase区别

...)当中的部分数据,大多数用户倾向于依赖传统的RDBMS(关系型数据)来处理这些数据集。HBase查询采用自定义语言,需要经过培训才能学习。HBase并不完全符合ACID,尽管它确实支持某些属性。HBase可以通过协同处理来处理小数据... 查看详情

hadoophdfshivehbase之间的关系

Hadoop:是一个分布式计算的开源框架HDFS:是Hadoop的三大核心组件之一Hive:用户处理存储在HDFS中的数据,hive的意义就是把好写的hive的sql转换为复杂难写的map-reduce程序Hbase:是一款基于HDFS的数据库,是一种NoSQL数据库,主要适用... 查看详情