Hive over HBase原理

Hive与HBase利用两者本身对外的API来实现整合,主要是靠HBaseStorageHandler进行通信,利用 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()来获取数据;

查询性能比较:

query1:
select count(1) from on_hdfs;
select count(1) from on_hbase;
query2(根据key过滤)
select * from on_hdfs
where key = ‘13400000064_1388056783_460095106148962′;
select * from on_hbase
where key = ‘13400000064_1388056783_460095106148962′;
query3(根据value过滤)
select * from on_hdfs where value = ‘XXX';
select * from on_hbase where value = ‘XXX';

on_hdfs (20万记录,150M,TextFile on HDFS)
on_hbase(20万记录,160M,HFile on HDFS)

Hive over HBase

on_hdfs (2500万记录,2.7G,TextFile on HDFS)
on_hbase(2500万记录,3G,HFile on HDFS)

Hive over HBase

全表扫描,hive_on_hbase查询时候如果不设置caching,性能远远不及hive_on_hdfs;
根据rowkey过滤,hive_on_hbase性能上略好于hive_on_hdfs,特别是数据量大的时候;
设置了caching之后,尽管比不设caching好很多,但还是略逊于hive_on_hdfs;

性能瓶颈分析

1. Map Task

Hive读取HBase表,通过MR,最终使用HiveHBaseTableInputFormat来读取数据,在getSplit()方法中对 HBase表进行切分,切分原则是根据该表对应的HRegion,将每一个Region作为一个InputSplit,即,该表有多少个Region,就 有多少个Map Task;
每个Region的大小由参数hbase.hregion.max.filesize控制,默认10G,这样会使得每个map task处理的数据文件太大,map task性能自然很差;
为HBase表预分配Region,使得每个Region的大小在合理的范围;
下图是给该表预分配了15个Region,并且控制key均匀分布在每个Region上之后,查询的耗时对比,其本质上是Map数增加。

Hive over HBase

2. Scan RPC 调用:

  • 在Scan中的每一次next()方法都会为每一行数据生成一个单独的RPC请求, query1和query3中,全表有2500万行记录,因此要2500万次RPC请求;
  • 扫描器缓存(Scanner Caching):HBase为扫描器提供了缓存的功能,可以通过参数hbase.client.scanner.caching来设置;默认是1;缓存 的原理是通过设置一个缓存的行数,当客户端通过RPC请求RegionServer获取数据时,RegionServer先将数据缓存到内存,当缓存的数 据行数达到参数设置的数量时,再一起返回给客户端。这样,通过设置扫描器缓存,就可以大幅度减少客户端RPC调用RegionServer的次数;但并不 是缓存设置的越大越好,如果设置的太大,每一次RPC调用将会占用更长的时间,因为要获取更多的数据并传输到客户端,如果返回给客户端的数据超出了其堆的 大小,程序就会终止并跑出OOM异常;

所以,需要为少量的RPC请求次数和客户端以及服务端的内存消耗找到平衡点。

rpc.metrics.next_num_ops
未设置caching,每个RegionServer上通过next()方法调用RPC的次数峰值达到1000万:

Hive over HBase

设置了caching=2000,每个RegionServer上通过next()方法调用RPC的次数峰值只有4000:

Hive over HBase

设置了caching之后,几个RegionServer上的内存消耗明显增加:

Hive over HBase

  • 扫描器批量(Scanner Batch):缓存是面向行一级的操作,而批量则是面向列一级的操作。批量可以控制每一次next()操作要取回多少列。比如,在扫描器中设置setBatch(5),则一次next()返回的Result实例会包括5列。
  • RPC请求次数的计算公式如下:
    RPC请求次数 = (表行数 * 每行的列数)/ Min(每行的列数,批量大小)  / 扫描器缓存

因此,在使用Hive over HBase,对HBase中的表做统计分析时候,需要特别注意以下几个方面:

1. 对HBase表进行预分配Region,根据表的数据量估算出一个合理的Region数;

2. rowkey设计上需要注意,尽量使rowkey均匀分布在预分配的N个Region上;

3. 通过set hbase.client.scanner.caching设置合理的扫描器缓存;

4. 关闭mapreduce的推测执行:

set mapred.map.tasks.speculative.execution = false;
set mapred.reduce.tasks.speculative.execution = false;

参考链接:Hive over HBase和Hive over HDFS性能比较分析

Hive整合HBase,操作HBase表相关推荐

  1. hive删除hbase数据_Hive进阶:Hive通过外部表操作Hbase数据

    概述: HBase: 查询效率比较高,常为实时业务提供服务,但是其查询方式比较单一,只能通过row方式get单条数据,或者通过scan加过滤器的方式扫描数据表获取数据. Hive: hive用来存储结 ...

  2. Hive 整合Hbase(来自学习资料--博学谷)

    1.摘要 Hive提供了与HBase的集成,使得能够在HBase表上使用HQL语句进行查询 插入操作以及进行Join和Union等复杂查询.同时也可以将hive表中的数据映射到Hbase中. 2.应用 ...

  3. Hive 整合 HBase

    作者 | 广   责编 | 张文 头图 | CSDN 下载自视觉中国 HBase 虽然可以存储数亿或数十亿行数据,但是对于数据分析来说不太友好,它只提供了简单的基于 Key 值的快速查询能力,没法进行 ...

  4. hive整合HBase:HBase table xsg:test05 doesn't exist while the table is declared as an external table

    版本 虚拟机centOS7 hive 1.2.1 hbase 1.2.6 1,在hive-site.xml中添加配置 <property><name>hbase.zookeep ...

  5. HBaseAPI——IDEA操作HBase数据库HBase与Hive的集成

    目录 一.IDEA操作HBase数据库 (一)添加依赖 (二)配置log4j (三)IDEA连接HBase并插入数据 1.代码实现 2.查看命名空间的表 (四)java操作HBase数据库--单元测试 ...

  6. hive整合hbase

    实验环境准备  Hive-2.3.3 Hbase-1.3.1 launcher start start-dfs.sh start-yarn.sh zkServer.sh start (3) ./mr- ...

  7. 2.4-2.5、Hive整合(整合Spark、整合Hbase)、连接方式Cli、HiveServer和hivemetastore、Squirrel SQL Client等

    2.4其它整合 2.4.1Hive整合Spark Spark整合hive,需要将hive_home下的conf下的hive_site.xml放到spark_home下的conf目录下.(3台服务器都做 ...

  8. 大数据_Hbase-API访问_Java操作Hbase_数据操作_表删除_表获取所有数据---Hbase工作笔记0014

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 这一节,我们先去复习一下,上一节的,对数据的操作,然后再接着看 https://download. ...

  9. hbase操作,创建命名空间,创建hbase表,添加数据,删除数据,通过RowKey获取数据,扫描数据,获取所有的表,获取ColumnFamily,删除表,获取hbase命名空间

    1.创建hbase工程 2 编写config.properties # hbase信息 hbase.zookeeper.quorum=xxx.xxx.xxx.xxx,xxx.xxx.xxx.xxx,x ...

最新文章

  1. 用Command实现校验器
  2. 使用CSS sprites减少HTTP请求
  3. 使用kali的工具攻击win10_使用“媒体创建工具”制作Win10系统安装U盘
  4. UITableView-FDTemplateLayoutCell自动计算UITableView高度的使用
  5. 前后端交互json字符串
  6. Dubbo(十)之配置加载流程
  7. django 403 错误:CSRF token missing or incorrect
  8. Java线程池ThreadPoolExecutor的实例
  9. python解压打开文件过多_让Python在后台自动解压各种压缩文件!
  10. 加载执行预编译的Sql :prepareStatement
  11. 图的表示:如何存储微博、微信等社交网络中的好友关系
  12. html看汉字选拼音小游戏
  13. 易周金融 | 邮惠万家银行开业;微信公众号叫停四类金融营销宣传
  14. 2020年5G通信工程类项目一览,哪些企业成功抢滩?
  15. 你见过的最全面的Python重点知识总结
  16. 笨鸟Linux学习连载之 - 万事开头难
  17. Python学习必备:10个奇妙的Python库,看完后我惊呆了
  18. linux C语言分区设备
  19. 银行信贷管理系统(C#)
  20. APT60DQ60BG ASEMI超快软恢复整流二极管

热门文章

  1. JVM 垃圾回收算法
  2. 很少人知道的Linux命令
  3. 维生素C生产含酸废水处理耐酸防腐更重要
  4. 点到直线垂足计算公式Java实现
  5. Unity插件系列-JellySprite
  6. 吴承恩竟在《西游记》中埋下这么一大伏笔!
  7. 小程序https域名校验文件放在根目录
  8. 神策数据推动安信证券落地埋点地图,提升数据建设效率与质量
  9. 乐荐网络-μ+,打造个性化的搜人平台
  10. 盒子flex浮动布局并且换行后左对齐