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 条评论
登录 后参与评论

相关文章

来自专栏有趣的Python

Python文件处理 - 专题笔记文件简介文件基础操作文件属性及OS模块使用文件练习

任何语言都离不开对文件的操作,Python语言是如何来操作和管理文件的。掌握文件的基本概念、基本操作,了解文件属性、 linux 系统的文件管理机制及os模块对...

3606
来自专栏小白安全

代码审计工具 Cobra 源码分析

0x00 前言 @0r3ak 师傅向我推荐了一款代码审计工具Cobra(wufeifei/cobra),该工具基于Python开发,可以针对多种语言的源...

4017
来自专栏python学习路

八、线程和进程 什么是线程(thread)?什么是进程(process)? 线程和进程的区别?Python GIL(Global Interpreter Lock)全局解释器锁

什么是线程(thread)? 线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一...

4167
来自专栏Java技术

Java多线程编程-(18)-等待/通知模式接口Condition接口深入分析

在上述两篇文章中讲解AQS的时候,我们已经知道了同步队列AQS的内部类ConditionObject实现了Condition接口,使用ReentrantLock...

641
来自专栏java思维导图

【一分钟知识】进程与线程,Thread的sleep与wait

java思维导图 xmind导图配合精美文章,可视化学习,让java不再难懂。 进程与线程 进程 是具有一定独立功能的程序关于某个数据集合上的一次运行活动,是操...

3599
来自专栏葡萄城控件技术团队

Asp.Net MVC4入门指南(2):添加一个控制器

MVC代表: 模型-视图-控制器 。MVC是一个架构良好并且易于测试和易于维护的开发模式。基于MVC模式的应用程序包含: · Models: 表示该应用程序的数...

1847
来自专栏Java帮帮-微信公众号-技术文章全总结

request;response 对象

response ? 1. response简介 response的类型为HttpServletResponse,它是Servlet的service()方法的参...

3117
来自专栏鬼谷君

django基础之二

1244
来自专栏闪电gogogo的专栏

Python初学——多线程Threading

接着上篇继续跟着沫凡小哥学Python啦 1.1 什么是多线程 Threading 多线程可简单理解为同时执行多个任务。 多进程和多线程都可以执行多个任务,线程...

1965
来自专栏分布式系统进阶

Kafka源码分析-配置文件

作为Class KafkaConfig的伴生类,定义了创建KafkaConfig对象的工厂方法:

771

扫码关注云+社区