Hbase compaction 源码分析二:详细 compaction 过程

因为major compact很影响hbase的读写性能,所以在不同版本是否major compact其实社区一直都在寻求优化,可根据需要选择不同的实现类RatioBasedCompactionPolicy、ExploringCompactionPolicy和StripeCompactionPolicy,选择了不同的policy(实现类)后,也选择了相应的选择算法从对应store中选择合适的hfile文件进行合并。有关不同Policy的算法性能影响及适合场景可参考文章:

http://hbasefly.com/2016/07/25/hbase-compaction-2/

hbase1.1.3版本使用的实现类是RatioBasedCompactionPolicy:

下面,从chore方法中开始分析 compactor的过程,从chore方法中可以看到minor compact将调用compactSplitThread的requestSystemCompaction方,major compact将调用ompactSplitThread的requestCompaction方法,但这两个方法都会调用CompactSplitThread的requestCompactionInternal方法:

这个是requestCompactionInternal方法原型:

从源码中可以看到,minor和major的区别再于参数CompactionRequest和selectNow。

这个方法很简单:根据请求compact的文件大小以及selectNow判断使用long或者short线程池,然后封装成CompactionRunner放到对应线程池中执行。

placeholder:selectCompaction方法有点长。

doCompaction方法是真正实现方法,在为了完成compact一共分为以下步骤:

1.选择需要Compaction的问题(只有Minor compaction)

2.执行前置listener

3.在region中以store为单位执行compaction

4.是否需要split

5.执行后置listerner

选择文件的方法是利用滑动窗口把最多的小文件进行合并,可参考http://www.cnblogs.com/cenyuhai/p/3746473.html:,本文档将着重分析在region中以store为单位进行compaction:

在保证当前store并没有在compaction后:

1.首先对region的lock锁加上读锁;

2.创建一个status用于监控和跟踪compaction的过程

3.调用doRegionCompactionPrep()方法进行compaction的准备,当前实现为空

4.调用对应store的compact方法

5.status标记成功

在store的compact方法中:

1.检查compactRequest参数

2.通过compaction(DefaultStoreEngine,查看类图)的compaction方法,并返回compaction后的新hfile文件

3.根据hbase.hstore.compaction.complete判断是否做一些compaction的complete工作:

a,把compact生成的文件移动到正确的位置

b.记录WALEdit日志

c.更新HStore相关的数据结构

d.归档旧的文件,关闭reader,重新计算file的大小

执行结束之后会生成临时文件,临时文件的意义在于,在Compaction执行期间,对于原数据访问没有影响。Compaction执行合并操作生成的文件生效过程,需要对Store的写操作加锁,阻塞Store内的更新操作,直到更新Store的storeFiles完成为止。

compact生成新文件的方法很简单,给源文件创建一个StoreScanner,之前说过StoreScanner能从多个Scanner当中每次都取出最小的kv,然后用StoreFile.Append的方法不停地追加写入即可:

PS,compaction对hbase的读写性能均有一定影响,有关对性能影响以及相关调优可参考:

http://hbasefly.com/2016/07/13/hbase-compaction-1/

http://hbasefly.com/2016/07/25/hbase-compaction-2/

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

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

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

控制MongoDB中的集群分片

分片标记是MongoDB 2.2.0版中的一项新功能。它应该强制写入到本地数据中心,但也可以用来将集合固定到一个分片或一组分片。

1807
来自专栏积累沉淀

Hadoop2.6(新版本)----MapReduce工作原理

最近在研究Hadoop,发现网上的一些关于Hadoop的资料都是以前的1.X版本的,包括MapReduce的工作原理,都是以前的一些过时了的东西,所以自己重新整...

20910
来自专栏大学生计算机视觉学习DeepLearning

c++ 网络编程(十)TCP/IP LINUX/windows 异步通知I/O模型与重叠I/O模型 附带示例代码

原文链接:https://www.cnblogs.com/DOMLX/p/9662931.html

522
来自专栏Linux驱动

第1阶段——uboot分析之硬件初始化start.S(4)

分析uboot第一个执行函数_start(cpu/arm920t/start.S)  打开cpu/arm920t/start.S 1 .globl _start...

1878
来自专栏瓜大三哥

yaffs_guts(一)

1. 计算所给Block所在位图 static __inline __u8 *yaffs_BlockBits(yaffs_Device *dev, int bl...

1725
来自专栏linux驱动个人学习

编译选项含义

编译选项: 现在我们Makefile中的编译选项有: ? -g :可执行程序包含调试信息;(给gdb调试使用) -O2:该优化选项会牺牲部分编译速度,除了执行-...

3686
来自专栏SDNLAB

Open vSwitch源码解析之基于VxLAN实现NSH解析功能

1. NSH-SFC概述 当前SFC的实现方案主要分为两种:一种基于NSH(network service header)。数据封装时,在L2或者L3数据后添加...

4285
来自专栏C/C++基础

腾讯2016春季校园实习招聘技术岗初试(一面)问题汇总(CC++后台)

2016.4.11日广州参加了腾讯的CC++后台技术一面,安全技术类的面试。面试官人很温和,经历了大概70分钟的问答,特将遇到的面试问题汇总如下,自己总结学习,...

571
来自专栏用户画像

5.4.3微程序控制器

微程序控制器采用存储逻辑实现,也就是把微操作信号代码化,使每条机器指令转化成为一段微程序并存入一个专门的存储器(控制存储器)中。微操作控制信号由微指令产生。

581
来自专栏Java架构沉思录

如何优雅地实现Redis命令setbits与getbits

在之前的文章《如何优雅地使用Redis之位图操作》和《再谈如何优雅地使用Redis之位图操作》中,笔者介绍了关于Redis位图操作的高级应用,其中就讲到了如何优...

752

扫码关注云+社区