HBase Compaction作用和触发条件

随着 HBase 运行一段时间 , Memstore 会 flush 生成多个 HFile , 随机查询一行数据 , 可能要检索多个 HFile , 会非常影响读的性能 。
一、为什么要执行 Compaction?HBase是基于一种LSM-Tree(Log-Structured Merge Tree)存储模型设计的 , 写入路径上是先写入WAL(Write-Ahead-Log)即预写日志 , 再写入memstore缓存 , 满足一定条件后执行flush操作将缓存数据刷写到磁盘 , 生成一个HFile数据文件 。 随着数据不断写入 , 磁盘HFile文件就会越来越多 , 文件太多会影响HBase查询性能 , 主要体现在查询数据的io次数增加 。 为了优化查询性能 , HBase会合并小的HFile以减少文件数量 , 这种合并HFile的操作称为Compaction , 这也是为什么要进行Compaction的主要原因 。
二、Compaction 作用其实Compaction操作属于资源密集型操作特别是IO密集型 。 Compaction其实就是以短时间内的IO消耗 , 以换取相对稳定的读取性能 。
HBase Compaction 主要有如下几个作用:
1. 文件合并;
2. 对于删除、过期、多余版本的数据进行清除;
在完成 Compaction 后 , HFile 文件数量减少 , 文件大小减小 , 能够显著提高读数据的效率 。
三、Compaction 分类HBase Compaction分为两种:Minor Compaction 与 Major Compaction , 通常我们简称为小合并、大合并 。 下面是一个简单示意图 。
HBase Compaction作用和触发条件文章插图
1. Minor Compaction
只合并小文件 , 对TTL过期数据设置过期清理 , 不会对文件内容进行清除操作 。
2. Major Compaction
对 Region 下同一个 Column family 的 StoreFile 合并为一个大文件 , 并且清除删除、过期、多余版本的数据 。
将一个Store中所有的HFile合并成一个HFile , 这个过程会清理三类没有意义的数据:被删除的数据(打了Delete标记的数据)、TTL过期数据、版本号超过设定版本号的数据 。 另外 , 一般情况下 , Major Compaction时间会持续比较长 , 整个过程会消耗大量系统资源 , 对上层业务有比较大的影响 。
因此 , 生产环境下通常关闭自动触发Major Compaction功能 , 改为手动在业务低峰期触发 。
HBase Compaction作用和触发条件文章插图
四、Compaction 触发条件HBase触发Compaction的条件有三种:memstore flush、后台线程周期性检查、手动触发 。
(1)memstore flush:可以说compaction的根源就在于flush , memstore 达到一定阈值或其他条件时就会触发flush刷写到磁盘生成HFile文件 , 正是因为HFile文件越来越多才需要compact 。 HBase每次flush之后 , 都会判断是否要进行compaction , 一旦满足minor compaction或major compaction的条件便会触发执行 。
(2)后台线程周期性检查: 后台线程 CompactionChecker 会定期检查是否需要执行compaction , 检查周期为hbase.server.thread.wakefrequency * hbase.server.compactchecker.interval.multiplier , 这里主要考虑的是一段时间内没有写入请求仍然需要做compact检查 。 其中参数 hbase.server.thread.wakefrequency 默认值 10000 即 10s , 是HBase服务端线程唤醒时间间隔 , 用于log roller、memstore flusher等操作周期性检查;参数 hbase.server.compactchecker.interval.multiplier 默认值1000 , 是compaction操作周期性检查乘数因子 。 10 * 1000 s 时间上约等于2hrs, 46mins, 40sec 。
(3)手动触发:是指通过HBase Shell、Master UI界面或者HBase API等任一种方式执行 compact、major_compact等命令 。
【HBase Compaction作用和触发条件】HBase Compaction操作是为了数据读取做的优化 , 总的来说是以牺牲磁盘io来换取读性能的基本稳定 。 Compaction操作分为minor compaction与major compaction , 其中major compaction消耗资源较大、对读写请求有一定影响 , 因此一般是禁用自动周期性执行而选择业务低峰期时手动执行 。