Hive和HBase通信原理讲解

作者:MM 发布时间:2021年02月22日 99次

HBase 虽然可以存储数亿或数十亿行数据,但是对于数据分析来说不太友好,它只提供了简单的基于 Key 值的快速查询能力,没法进行大量的条件查询。

现有 HBase 的查询工具有很多如:Hive、Tez、Impala、Shark/Spark、Phoenix 等。今天主要说 Hive。

Hive 方便地提供了 Hive QL 的接口来简化 MapReduce 的使用, 而 HBase 提供了低延迟的数据库访问。如果两者结合,可以利用 MapReduce 的优势针对 HBase 存储的大量内容进行离线的计算和分析。

Hive 和 HBase 通信原理

Hive 与 HBase 整合的实现是利用两者本身对外的 API 接口互相通信来完成的。这种相互通信是通过 $HIVE_HOME/lib/hive-hbase-handler-{hive.version}.jar 工具类实现的。

通过 HBaseStorageHandler,Hive 可以获取到 Hive 表所对应的 HBase 表名、列簇和列、InputFormat、OutputFormat 类、创建和删除 HBase 表等。

Hive 访问 HBase 中表数据,实质上是通过 MapReduce 读取 HBase 表数据,其实现是在 MR 中,使用 HiveHBaseTableInputFormat 完成对 HBase 表的切分,获取 RecordReader 对象来读取数据。

对 HBase 表的切分原则是一个 Region 切分成一个 Split,即表中有多少个 Regions,MR 中就有多少个 Map;读取 HBase 表数据都是通过构建 Scanner,对表进行全表扫描,如果有过滤条件,则转化为 Filter。当过滤条件为 rowkey 时,则转化为对 rowkey 的过滤;Scanner 通过 RPC 调用 RegionServer 的 next来获取数据;

基本通信原理如下:

Hive-HBase

具体步骤

新建 HBase 表:

create'test', 'f1'

插入数据:

put'test', '1', 'f1:c1', 'name1' put 'test', '1', 'f1:c2', 'name2' put 'test', '2', 'f1:c1', 'name1' put 'test', '2', 'f1:c2', 'name2' put 'test', '3', 'f1:c1', 'name1' put 'test', '3', 'f1:c2', 'name2'

这里 HBase 有个列簇 f1,有两个列 c1 和 c2,新建 Hive 表关联 HBase 的这两列:

SEThbase.zookeeper.quorum=zkNode1,zkNode2,zkNode3; SETzookeeper.znode.parent=/hbase; ADD jar hive-hbase- handler-{hive.version}.jar; CREATEEXTERNALTABLEtest.test ( rowkey string, c1 string, c2 string ) STOREDBY'org.apache.hadoop.hive.hbase.HBaseStorageHandler' WITHSERDEPROPERTIES ( "hbase.columns.mapping"= ":key,f1:c1,f1:c2") TBLPROPERTIES ( "hbase.table.name"= "test");

这里使用外部表映射到 HBase 中的表,Hive 对应的 hdfs 目录是空的,数据仍然在 HBase 中,这样在 Hive 中删除表,并不会删除 HBase 中的表,否则,就会删除。

另外,除了 rowkey,其他三个字段使用 Map 结构来保存 HBase 中的每一个列族。

其中,参数解释如下:

hbase.zookeeper.quorum:

指定 HBase 使用的 zookeeper 集群,默认端口是 2181,可以不指定;如果指定,格式为 zkNode1:2222,zkNode2:2222,zkNode3:2222

zookeeper.znode.parent

指定 HBase 在 zookeeper 中使用的根目录

hbase.columns.mapping

Hive 表和 HBase 表的字段一一映射,分别为:Hive 表中第一个字段映射:key(rowkey),第二个字段映射列族 f1:c1,第三个字段映射列族 f1:c2。

hbase.table.name

HBase 中表的名字

也可以直接在 Hive 中创建表的同时,完成在 HBase 中创建表。

在 Hive 中查询 HBase 表:

hive>select * from test.test; OK 1name1 name2 2name1 name2 3name1 name2

也可以插入数据:

insertintotest.test select'4', 'name4', 'name4';

查看 HBase 的数据:

hive>select * from test.test; OK 1name1 name2 2name1 name2 3name1 name2 4name4 name4

Spark 读取提升速度

Hive 关联 HBase 实际是底层是 MR,速度较慢,此时可以使用 spark sql 读取 Hive 表,进行查询操作,从而访问 HBase 数据。

相关阅读

换一换

热门教程

换一换

本周热门

装机必备

更多
人气飙升 时下最热 品质好游