前言
之前学习 HBase 就有疑惑,HBase 虽然可以存储数亿或数十亿行数据,但是对于数据分析来说,不太友好,只提供了简单的基于 Key 值的快速查询能力,没法进行大量的条件查询。
不过,Hive 与 HBase 的整合可以实现我们的这个目标。不仅如此,还能通过 Hive 将数据批量地导入到 HBase 中。
今天我们来为大家介绍hive和HBase的区别,以及相互间的整合联用。

两者分别是什么?
Apache Hive是一个构建在Hadoop基础设施之上的数据仓库。通过Hive可以使用HQL语言查询存放在HDFS上的数据。HQL是一种类SQL语言,这种语言最终被转化为Map/Reduce. 虽然Hive提供了SQL查询功能,但是Hive不能够进行交互查询--因为它只能够在Haoop上批量的执行Hadoop。
Apache HBase是一种Key/Value系统,它运行在HDFS之上。和Hive不一样,Hbase的能够在它的数据库上实时运行,而不是运行MapReduce任务。Hive被分区为表格,表格又被进一步分割为列簇。列簇必须使用schema定义,列簇将某一类型列集合起来(列不要求schema定义)。例如,“message”列簇可能包含:“to”, ”from” “date”, “subject”, 和”body”. 每一个 key/value对在Hbase中被定义为一个cell,每一个key由row-key,列簇、列和时间戳。在Hbase中,行是key/value映射的集合,这个映射通过row-key来唯一标识。Hbase利用Hadoop的基础设施,可以利用通用的设备进行水平的扩展。

两者的特点
Hive帮助熟悉SQL的人运行MapReduce任务。因为它是JDBC兼容的,同时,它也能够和现存的SQL工具整合在一起。运行Hive查询会花费很长时间,因为它会默认遍历表中所有的数据。虽然有这样的缺点,一次遍历的数据量可以通过Hive的分区机制来控制。分区允许在数据集上运行过滤查询,这些数据集存储在不同的文件夹内,查询的时候只遍历指定文件夹(分区)中的数据。这种机制可以用来,例如,只处理在某一个时间范围内的文件,只要这些文件名中包括了时间格式。
HBase通过存储key/value来工作。它支持四种主要的操作:增加或者更新行,查看一个范围内的cell,获取指定的行,删除指定的行、列或者是列的版本。版本信息用来获取历史数据(每一行的历史数据可以被删除,然后通过Hbase compactions就可以释放出空间)。虽然HBase包括表格,但是schema仅仅被表格和列簇所要求,列不需要schema。Hbase的表格包括增加/计数功能。

限制
Hive目前不支持更新操作。另外,由于hive在hadoop上运行批量操作,它需要花费很长的时间,通常是几分钟到几个小时才可以获取到查询的结果。Hive必须提供预先定义好的schema将文件和目录映射到列,并且Hive与ACID不兼容。
HBase查询是通过特定的语言来编写的,这种语言需要重新学习。类SQL的功能可以通过Apache Phonenix实现,但这是以必须提供schema为代价的。另外,Hbase也并不是兼容所有的ACID特性,虽然它支持某些特性。最后但不是最重要的--为了运行Hbase,Zookeeper是必须的,zookeeper是一个用来进行分布式协调的服务,这些服务包括配置服务,维护元信息和命名空间服务。
应用场景
Hive适合用来对一段时间内的数据进行分析查询,例如,用来计算趋势或者网站的日志。Hive不应该用来进行实时的查询。因为它需要很长时间才可以返回结果。
Hbase非常适合用来进行大数据的实时查询。Facebook用Hbase进行消息和实时的分析。它也可以用来统计Facebook的连接数。
区别总结
Hive和Hbase是两种基于Hadoop的不同技术--Hive是一种类SQL的引擎,并且运行MapReduce任务,Hbase是一种在Hadoop之上的NoSQL 的Key/vale数据库。当然,这两种工具是可以同时使用的。就像用Google来搜索,用FaceBook进行社交一样,Hive可以用来进行统计查询,HBase可以用来进行实时查询,数据也可以从Hive写到Hbase,设置再从Hbase写回Hive。
Hive 与 HBase 整合的适用场景:
1.通过 Hive 与 HBase 整合,可以将 HBase 的数据通过 Hive 来分析,让 HBase 支持 JOIN、GROUP 等 SQL 查询语法。
2.实现将批量数据导入到 HBase 表中。
依赖条件
需要有以下依赖,ambari 已经为我们做好了这一切:
1.已有 HDFS、MapReduce、Hive、Zookeeper、HBase 环境。
2.确保 Hive 的 lib 目录下有 hive-hbase-handler-xxx.jar、Zookeeper jar、HBase Server jar、HBase Client jar 包。
使用HBase Hive集成
注意,这里与HDP 2.x不同:在 HDP 3.0 中对 Hive-3.1.0 的更改是所有StorageHandler必须标记为“外部”,没有 StorageHandler 创建的非外部表。如果在创建 Hive 表时存在相应的 HBase 表,它将模仿“外部”表的 HDP 2.x 语义。如果在创建 Hive 表时不存在相应的 HBase 表,则它将模仿非外部表的 HDP 2.x 语义。
总结:不管 HBase 表是否存在,在 Hive 中都要使用 external 表来与 HBase 表进行关联,如果关联的 HBase 表不存在,Hive 会自动创建Hbase 表。
示例
1.HBase表不存在

这里简单说一下建表时的参数:
hbase.columns.mapping 是必须的,这将会和 HBase 表的列族进行验证。
hbase.table.name 属性是可选的,默认指定 HBase 表名与 Hive 表名一致。
此时,hivetable 与 hbasetable 都是空的。我们准备一些数据:

insert 语句会触发 map 任务,如下图所示:

任务完成之后,Hive 与 HBase 表中就都存在数据了。


当将 hivetable 表删除,对应的 hbasetable 表不受影响,里面依旧有数据。当删除 hbasetable 表后,再查询 hivetable 表数据,会报错:Error: java.io.IOException: org.apache.hadoop.hbase.TableNotFoundException: hbase_table (state=,code=0),这是正常的。
注意!注意!注意:在上述示例中,我们使用的 insert 命令向 Hive 表中插入数据。对于批量数据的插入,还是建议使用 load 命令,但对于 Hive 外部表来说,不支持 load 命令。我们可以先创建一个 Hive 内部表,将数据 load 到该表中,最后将查询内部表的所有数据都插入到与 Hbase 关联的 Hive 外部表中,就可以了,相当于中转一下。
2. HBase表已存在
创建 HBase 表:

插入一些数据:

再创建一个简单的 Hive 外部表,语法与之前的一致:

查询全部数据:


条件查询:

这样,我们就可以使用 Hive 来分析 HBase 中的数据了。
整合总结
1.使用 hive-hbase-handler-xxx.jar 包实现 Hive 与 HBase 关联。
2.Hive 读取的是 HBase 表最新的数据。
3.通过 Hive 创建的 HBase 表的值默认只有一个 VERSION ,可之后再修改 HBase 表值的最大 VERSION 数。
4.Hive 只显示与 HBase 对应的列值,而那些没有对应的 HBase 列在 Hive 表中不显示。
5.Hive 表与 HBase 表关联后,数据可以在 Hive 端插入,也可在 HBase 中插入。
6.创建 Hive 外部表与 HBase 的关联,可实现将 Hive 数据导入到 HBase 中。该方式是利用两者本身对外的 API 接口互相通信来完成的,在数据量不大(4T以下)的情况下可以选择该方式导入数据。
以上就是小编整理的大数据Hive和HBase区别及整合,喜欢的小伙伴请多多评论收藏转发,另外小编还整理了一些HBase和Hive学习资料,有需要的+++VX:bjmsb1来免费领取吧!!!



网友评论