Hbase compaction 源码分析一:compaction 概况分析

regionserver初始化的时候会初始化两个与compact相关的线程它们分别是:compactionChecker和compactSplitThread。其中compactionChecker用于周期性地检查当前是否有compact请求,实现类是ScheduledChore检查周期由参数threadWakeFrequency控制,默认值是10s,也可以在参数hbase.server.thread.frequency中配置。

另一个成员变量compactSplitThread负责该region server上的compact/split请求具体执行。

其包含了四个线程池分别用于major compact,minor compact split和merge。

compact的大体步骤是:compactionChecker周期性地检查是否有compact请求,如果出现了compact请求,那么将请求以及请求的周边信息一起包装成CompactionContext,将CompactionContext交付给regionserver的compactSplitThread,compactSplitThread会根据compact的类型为它分配合适的线程池,并包装成compactSplitThread内部类CompactionRunner交给对应线程池,线程池调度CompactionRunner,执行它的run方法,完成compact操作。

compactionChecker实现类是CompactionChecker,其继承了ScheduledChore,在之前已经分析过,这个类通过实现chore方法而实现周期性的调用,其初始化是在initializeThreads中:

我们直接看其Chore方法:

这个方法比较简单,取出所有在线的region,遍历region上的所有store(HStore)判断是否需要compact,这里判断是

可以看到最终条件为:HStore中StoreFIles的个数 – 正在执行Compacting的文件个数 > minFilesToCompact。

我们都知道compact分成了两种,monor和major,其区别在官方文档中有说明:

1.Minor操作只用来做部分文件的合并操作以及包括minVersion=0并且设置ttl的过期版本清理,不做任何删除数据、多版本数据的清理工作。也即是说选取一些小的、相邻的StoreFile将他们合并成一个更大的StoreFile,在这个过程中不会处理已经Deleted或Expired的Cell。一次Minor Compaction的结果是更少并且更大的StoreFile。

2.Major操作是对Region下的HStore下的所有StoreFile执行合并操作,最终的结果是整理合并出一个文件。这个过程还会清理三类无意义数据:被删除的数据、TTL过期数据、版本号超过设定版本号的数据。另外,一般情况下,Major Compaction时间会持续比较长,整个过程会消耗大量系统资源,对上层业务有比较大的影响。因此线上业务都会将关闭自动触发Major Compaction功能,改为手动在业务低峰期触发。

chore方法中needsCompaction判断的是minor compact是否需要执行。从chore方法中可以直观的看到major compact是通过isMajorCompaction()方法判断的这是很多判断条件的合成,其中最为重要的一个是hbase.hregion.majorcompaction设置的值,也就是判断上次进行majorCompaction到当前的时间间隔,如果超过设置值,则满足一个条件,同时另外一个条件是compactSelection.getFilesToCompact().size() < this.maxFilesToCompact。

因此,通过设置hbase.hregion.majorcompaction = 0可以关闭CompactionChecke触发的major compaction,但是无法关闭用户调用级别的majorcompact。isMajorCompaction,最终实现的判断是来自RatioBasedCompactionPolicyd的isMajorCompaction方法:

原创声明,本文系作者授权云+社区-专栏发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏蘑菇先生的技术笔记

那些年我们一起追过的缓存写法(三)

25210
来自专栏CRPER折腾记

Angular 2 + 折腾记 :(4)初步了解路由及使用

路由就是控制视图与视图之间的跳转,之间还可以传递参数什么的,路由的退后及前进不会完整的请求整个页面,还可以完全不请求(在生命周期里面控制);

692
来自专栏Java3y

图书管理系统【总结】

感想 该项目是目前为止,我写过代码量最多的项目了.....虽然清楚是没有含金量的【跟着视频来写的】,但感觉自己也在进步中...... 写的过程中,出了不少的问题...

3445
来自专栏技术分享

.NET/ASP.NET MVC Controller 控制器(IController控制器的创建过程)

阅读目录: 1.开篇介绍 2.ASP.NETMVC IControllerFactory 控制器工厂接口 3.ASP.NETMVC DefaultControl...

2196
来自专栏大前端开发

使用mpvue开发小程序教程(五)

在上一章节中,我们了解了组件的三个基本特性以及组件的基本使用方法。在实际的小程序开发中,我们应该以组件的思维去设计每个小程序的功能页面,对其进行合理的组件拆分,...

942
来自专栏牛客网

2018秋招面经-后端开发

博主渣渣本科,挣扎到十一月秋招终于结束了。面过百度/腾讯/小米/网易/搜狗/知乎/京东/360/瓜子。期间总结了一些面试题目,现在放上来。由于是博主自己的面经记...

3619
来自专栏IT技术精选文摘

分布式之缓存击穿

793
来自专栏开源优测

python selenium2示例 - 同步机制

前言 在使用python selenium2进行自动化测试实践的过程中,经常会遇到元素定位不到,弹出框定位不到等等各种定位不到的情况,在大多数的情况下,无非是以...

2694
来自专栏熊二哥

快速入门系列--WebAPI--03框架你值得拥有

    接下来进入的是俺在ASP.NET学习中最重要的WebAPI部分,在现在流行的互联网场景下,WebAPI可以和HTML5、单页应用程序SPA等技术和理念很...

4049
来自专栏我杨某人的青春满是悔恨

设计模式之结构型模式(上)

GoF 归纳整理的23个设计模式依据其目的可以分为创建型(Creational)、结构型(Structural)和行为型(Behavioral)三种。关于创建型...

773

扫码关注云+社区