先给结论吧:HBase利用compaction机制,通过大量的读延迟毛刺和一定的写阻塞,来换取整体上的读取延迟的平稳。

1.为什么要compaction

在上一篇 HBase读写 中我们提到了,HBase在读取过程中,会创建多个scanner去抓去数据。

其中,会创建多个storefilescanner去load HFile中的指定data block。所以,我们很容易就想到,如果说HFile太多的话,那么就会涉及到很多磁盘IO,这个就是常说的“读放大”现象。

因此,就有了今天的主题,HBase的核心特性——compaction。

通过执行compaction,可以使得HFile的数量基本稳定,使得IO seek次数稳定,然后每次的查询rt才能稳定在一定范围内。

2.compaction的分类

compaction分为两种,minor compaction和major compaction。

Minor compaction主要是将一些相邻的小文件合并为大文件,这个过程仅仅做文件的合并,并不会删除deleted type的数据和ttl过期的数据。

Major compaction是指将一个HStore下的所有文件合并为一个HFile,这个过程会消耗大量系统资源,一般线上会关闭自动定期major compaction的功能(将参数hbase.hregion.majorcompaction设为0即可关闭,但是flush的触发还是会进行),改为手动低峰执行。这个过程会删除三类数据:标记为删除的数据、TTL过期的数据、版本号不满足要求的数据。

具体什么时候触发哪种类型的compaction呢?

满足以下任意条件会触发major compaction,否则就是minor compaction:

  • 用户强制执行major compaction
  • 长时间没有compact,且候选文件小于阈值(hbase.hstore.compaction.max)
  • Store中含有reference文件(split产生的临时文件),需要通过 major compact进行数据迁移,删除临时文件

3.compaction的触发时机

compaction的触发时机一共有三种:

1)MemStore flush:

这个在一开始就提到了,相信也很容易理解。因为每次MemStore flush会产生新的HFile文件,而文件数量超过限制,自然就触发了compaction。这里需要注意的是,我们在 深入HBase架构 一文中已经提到,memstore是以region为单位进行flush的,也就是说,一个region内的任意一个HStore下面的memstore满了,这个region下的所有HStore的memstore都会触发flush。然后每个HStore都有可能触发compaction。

2)后台线程周期性检查

HBase有一个后台线程CompactionChecker,会定期巡检触发检查,是否进行compaction。

这里和flush触发的compaction有所不同,这里先检查文件树是否大于阈值,大于就触发compaction。如果没有大于阈值,还会检查下HFile里面的最早更新时间,是否早于某个阈值(hbase.hregion.majorcompaction),如果早于,就触发major compaction来达到清理无用数据的目的。

3)手动触发:

由于我们担心major compaction会影响业务,因此会选择业务低峰期进行手动触发。

还有一部分原因,是用户执行ddl后,希望理解生效,也会执行手动触发major compaction。

最后,可能是因为磁盘容量不够了,需要major compaction来手动清理无效数据,合并文件。

4.HFile合并过程

1)读取待合并的HFile的key value,写入临时文件中

2)将临时文件移动到对应的region的数据目录

3) 将compaction的输入文件路径和输出文件路径写入WAL日志,然后强行执行sync

4)将对应region数据目录下的输入文件全部删除

5.compaction的副作用分析

当然,compaction本身也要涉及到大量文件的读写,在表现上就是会有一定的读延迟毛刺。因此,我们可以认为,compaction过程是使用短时间的大量IO消耗来换取后续查询的低延迟。

另一方面,假设处于长时间的高写入量,HFile的数量一直增长,compaction的速度赶不上HFile增长的速度,那么,HBase会暂时阻塞写请求。当每次memstore进行flush的时候,如果一个HStore中的HFile的数量超过了hbase.hstore.blockingStoreFIles(默认为7),那么就会暂时阻塞flush的动作,阻塞时间为abase.hstore.blockingWaitTime。当阻塞时间过去后,观察HFile的数量下降到上述值,那么就会继续flush的操作。这样,就保证了HFile数量的稳定,但是对写入会有一定的速度影响。

看到这里了,原创不易,点个关注、点个赞吧,你最好看了~

知识碎片重新梳理,构建Java知识图谱:https://github.com/saigu/JavaKnowledgeGraph(历史文章查阅非常方便)

扫码关注我的公众号“阿丸笔记”,第一时间获取最新更新。同时可以免费获取海量Java技术栈电子书、各个大厂面试题。

「从零单排HBase 04」HBase高性能查询揭秘的更多相关文章

  1. 「从零单排canal 04」 启动模块deployer源码解析

    基于1.1.5-alpha版本,具体源码笔记可以参考我的github:https://github.com/saigu/JavaKnowledgeGraph/tree/master/code_read ...

  2. 「从零单排canal 03」 canal源码分析大纲

    在前面两篇中,我们从基本概念理解了canal是一个什么项目,能应用于什么场景,然后通过一个demo体验,有了基本的体感和认识. 从这一篇开始,我们将从源码入手,深入学习canal的实现方式.了解can ...

  3. 「从零单排canal 05」 server模块源码解析

    基于1.1.5-alpha版本,具体源码笔记可以参考我的github:https://github.com/saigu/JavaKnowledgeGraph/tree/master/code_read ...

  4. 「从零单排canal 06」 instance模块源码解析

    基于1.1.5-alpha版本,具体源码笔记可以参考我的github:https://github.com/saigu/JavaKnowledgeGraph/tree/master/code_read ...

  5. 「从零单排canal 07」 parser模块源码解析

    基于1.1.5-alpha版本,具体源码笔记可以参考我的github:https://github.com/saigu/JavaKnowledgeGraph/tree/master/code_read ...

  6. 「从零单排canal 01」 canal 10分钟入门(基于1.1.4版本)

    1.简介 canal [kə'næl],译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据 订阅 和 消费.应该是阿里云DTS(Data Transfer Servi ...

  7. 「从零单排canal 02」canal集群版 + admin控制台 最新搭建姿势(基于1.1.4版本)

    canal [kə'næl],译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据 订阅 和 消费.应该是阿里云DTS(Data Transfer Service)的开 ...

  8. 「从零单排HBase 12」HBase二级索引Phoenix使用与最佳实践

    Phoenix是构建在HBase上的一个SQL层,能让我们用标准的JDBC APIs对HBase数据进行增删改查,构建二级索引.当然,开源产品嘛,自然需要注意“避坑”啦,阿丸会把使用方式和最佳实践都告 ...

  9. 「从零单排HBase 05」核心特性region split

    HBase拥有出色的扩展性,其中最依赖的就是region的自动split机制. 1.split触发时机与策略 前面我们已经知道了,数据写入过程中,需要先写memstore,然后memstore满了以后 ...

随机推荐

  1. 57)PHP,自动加载类注意项

    关于这个里面的那个if  里面判断是否是核心启动类,一般会想到,用in_array或者是isset              in_array判断是数组里面有没有这个值,但是isset判断的是数组里面 ...

  2. springboot学习笔记:7.IDEA下5步完成热部署配置

    开发工具IDEA 2017.02   JDK1.8 1.pom.xml中增加: <dependency> <groupId>org.springframework.boot&l ...

  3. @echo off 批处理

    一个批处理文件 @echo off ipconfig /all @pause -------------------------------- @echo off 是什么意思 就是说关闭回显@echo ...

  4. Android Studio调用系统隐藏接口EthernetManager

    google source签名文件参考:https://android.googlesource.com/platform/build/+/donut-release/target/product/s ...

  5. 为什么说iPhone无望恢复中国市场?

    直到现在还记得,iPhone 4在国内当时引发的追捧狂潮.彼时iPhone 4绝对是一机难求,上至土豪下至学生都以拥有iPhone 4为荣.发售接近一年后仍然需要加价,价格动辄达到七八千元,真正成为了 ...

  6. js 实现数据结构 -- 散列(HashTable)

    原文: 在Javascript 中学习数据结构与算法. 概念: HashTable 类, 也叫 HashMap 类,是 Dictionary 类的一种散列表实现方式. 散列算法的作用是尽可能快地在数据 ...

  7. Python 搭建webdriver环境遇到的问题总结

    安装过程是参考<selenium2Python自动化测试实战>中Pythonwebdriver环境搭建章节 在安装过程中,遇到了一些问题,总结一下,为日后自己再遇到相同问题做个笔记以便查看 ...

  8. 【XP系统下载U盘装系统】用电脑店超级U盘装XP系统详细图文教程

    现在U盘装系统已经越来越流行了,不仅方便而且简单,由于U盘启动盘用的制作工具不同,其中比较流行的有老毛桃.电脑店.大白菜.一键U盘装系统等等,因此安装过程中也有不尽相同的,今天就和大家分享下利用电脑店 ...

  9. 那些被刻意“阉割”的名人名言

    "天才是百分之一的灵感,百分之九十九的汗水",这句名言大家都知道的吧!不过还有好多人不知道的是这句名言还有后半句:"但百分之一的灵感甚至比百分之九十九的汗水更重要.&qu ...

  10. 将配置好的虚拟机文件导入VMware

    第一步:打开VMware Workstation Pro 第二步:  选择文件,图示: 第三步:点击打开,选择配置好的虚拟机文件目录 点击打开就ok了,图示