Hive与Hbase关系整合
近期工作用到了Hive与Hbase的关系整合,虽然从网上参考了很多的资料,但是大多数讲的都不是很细,于是决定将这块知识点好好总结一下供大家分享,共同掌握!
本篇文章在具体介绍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关系整合的更多相关文章
- Hadoop Hive与Hbase关系 整合
用hbase做数据库,但因为hbase没有类sql查询方式,所以操作和计算数据很不方便,于是整合hive,让hive支撑在hbase数据库层面 的 hql查询.hive也即 做数据仓库 1. 基于Ha ...
- hive与hbase的整合
Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供完整的sql查询功能,可以将sql语句转换为MapReduce任务进行运行.其优点学习成本低,可以通过类S ...
- 将CDH中的hive和hbase相互整合使用
一..hbase与hive的兼容版本: hive0.90与hbase0.92是兼容的,早期的hive版本与hbase0.89/0.90兼容,不需要自己编译. hive1.x与hbase0.98.x或则 ...
- hive和hbase整合的原因和原理
为什么要进行hive和hbase的整合? hive是高延迟.结构化和面向分析的: hbase是低延迟.非结构化和面向编程的. Hive集成Hbase就是为了使用hbase的一些特性.或者说是中和它们的 ...
- Hadoop Hive与Hbase整合+thrift
Hadoop Hive与Hbase整合+thrift 1. 简介 Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供完整的sql查询功能,可以将sql语句 ...
- 大数据工具篇之Hive与HBase整合完整教程
大数据工具篇之Hive与HBase整合完整教程 一.引言 最近的一次培训,用户特意提到Hadoop环境下HDFS中存储的文件如何才能导入到HBase,关于这部分基于HBase Java API的写入方 ...
- hive存储处理器(StorageHandlers)以及hive与hbase整合
此篇文章基于hive官方英文文档翻译,有些不好理解的地方加入了我个人的理解,官方的英文地址为: 1.https://cwiki.apache.org/confluence/display/Hive/S ...
- 数据导入(一):Hive On HBase
Hive集成HBase可以有效利用HBase数据库的存储特性,如行更新和列索引等.在集成的过程中注意维持HBase jar包的一致性.Hive与HBase的整合功能的实现是利用两者本身对外的API接口 ...
- 二十、Hadoop学记笔记————Hive On Hbase
Hive架构图: 一般用户接口采用命令行操作, hive与hbase整合之后架构图: 使用场景 场景一:通过insert语句,将文件或者table中的内容加入到hive中,由于hive和hbase已经 ...
随机推荐
- Android 热修复使用Gradle Plugin1.5改造Nuwa插件
随着谷歌的Gradle插件版本号的不断升级,Gradle插件如今最新的已经到了2.1.0-beta1,相应的依赖为com.android.tools.build:gradle:2.0.0-beta6, ...
- 【Excle数据透视】如何隐藏数据透视表字段的分类汇总
如下图:是显示数据透视表的分类汇总 那么我们现在想弄成以下这样,不显示分类汇总 如何操作呢? 步骤 单击数据透视表任意单元格→数据透视表工具→设计→分类汇总→不显示分类汇总 ***显示分类汇总*** ...
- Vue-cli + Express 构建的SPA Blog(前后分离)
代码地址如下:http://www.demodashi.com/demo/12526.html 为什么学习并使用Vue 1.发展趋势 最近这几年的前端圈子,由于戏台一般精彩纷呈,从 MVC 到 MVV ...
- Linux如何查看进程、杀死进程、查看端口等常用命令
查看进程号 1.ps 命令用于查看当前正在运行的进程.grep 是搜索 例如: ps -ef | grep java表示查看所有进程里 CMD 是 java 的进程信息2.ps -aux | grep ...
- LeetCode LinkList 23. Merge k Sorted Lists
这两天一直也没有顾上记录一下自己做过的题目,回头看看,感觉忘的好快,今天做了一个hard,刚开始觉得挺难得,想了两种方法,一种是每次都从k个list中选取最小的一个,为空的直接跳过,再就是每次合并其中 ...
- IBM Rational Appscan使用之扫描结果分析
转自:http://www.nxadmin.com/penetration/825.html 之前有IBM Rational Appscan使用详细说明的一篇文章,主要是针对扫描过程中配置设置等.本文 ...
- linux 下mtime,ctime,atime分析
一.atime.ctime与mtime atime是指access time,即文件被读取或者执行的时间,修改文件是不会改变access time的.网上很多资料都声称cat.more等读取文件的命令 ...
- IPython introduction
转载:http://blog.csdn.net/gavin_john/article/details/53086766 1. IPython介绍 ipython是一个python的交互式shell,比 ...
- Python读取文件文件夹并检索
import os import os.path f=open("Shouldlist.txt") ShouldList=[] while 1: line =f.readline( ...
- python 的三元表达式
python中的三目运算符不像其他语言 其他的一般都是 判定条件?为真时的结果:为假时的结果 如 result=5>3?1:0 这个输出1,但没有什么意义,仅仅是一个例子. 而在python中的 ...