Hive 整合 HBase
作者 | 广责编 | 张文头图 | CSDN 下载自视觉中国HBase 虽然可以存储数亿或数十亿行数据,但是对于数据分析来说不太友好,它只提供了简单的基于 Key 值的快速查询能力...
作者 | 广 责编 | 张文
头图 | CSDN 下载自视觉中国
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](https://i-blog.csdnimg.cn/blog_migrate/664599ddf398930953d755a4ac1b42d4.png)
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 的这两列:
SET hbase.zookeeper.quorum=zkNode1,zkNode2,zkNode3;SET zookeeper.znode.parent=/hbase;ADD jar hive-hbase-handler-{hive.version}.jar;CREATE EXTERNAL TABLE test.test (rowkey string,c1 string,c2 string) STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'WITH SERDEPROPERTIES ("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;OK1 name1 name22 name1 name23 name1 name2
也可以插入数据:
insert into test.test select '4', 'name4', 'name4';
查看 HBase 的数据:
hive> select * from test.test;OK1 name1 name22 name1 name23 name1 name24 name4 name4
Spark 读取提升速度
Hive 关联 HBase 实际是底层是 MR,速度较慢,此时可以使用 spark sql 读取 Hive 表,进行查询操作,从而访问 HBase 数据。
程序员如何避免陷入“内卷”、选择什么技术最有前景,中国开发者现状与技术趋势究竟是什么样?快来参与「2020 中国开发者大调查」,更有丰富奖品送不停!
☞我们差点就用不上 Java 了!☞印度永久封禁了微信、百度、TikTok 等 59 款中国 App……
☞RISC-V 正在成为芯片世界中的 Linux
更多推荐
所有评论(0)