Hadoop HBase中Compaction原理学习

24 篇文章 0 订阅
[size=large][b]HBase Compaction策略[/b][/size]
RegionServer这种类LSM存储引擎需要[color=red][b]不断的进行Compaction来减少磁盘上数据文件的个数和删除无用的数据从而保证读性能。[/b][/color]

RegionServer后台有一组负责flush region的线程(MemStoreFlusher),每次从flushQueue中拿出一个flush region请求,[color=red][b]会检查这个region是否有某个store包含的storefile个数超过配置
hbase.hstore.blockingStoreFiles,默认7[/b][/color],如果超过,说明storefile个数已经到了会影响读性能的地步,那么就看这个flush region请求是否已经有blockingWaitTime(hbase.hstore.blockingWaitTime,默认90s)没有执行了,如果是,这时候需要立即执行flush region,为了防止OOM。如果没有超过blockingWaitTime,那么先
看看region是否需要分裂,如果不需要,则向后台的CompactionSplitThread请求做一次
Compaction(从这里可以看出,split优先级比compaction高),然后重新将这个flush region加入
flushQueue,延后做flush.

[size=medium][color=red][b]HBase根据合并规模将Compaction分为了两类:MinorCompaction和MajorCompaction[/b][/color][/size]

[b]Minor Compaction[/b]是指选取一些小的、相邻的StoreFile将他们合并成一个更大的StoreFile,在这个过程中不会处理已经Deleted或Expired的Cell。一次Minor Compaction的结果是更少并且更大的StoreFile。

[b]Major Compaction[/b]是指将所有的StoreFile合并成一个StoreFile,这个过程还会清理三类无意义数据:[color=blue][b]被删除的数据、TTL过期数据、版本号超过设定版本号的数据。[/b][/color]另外,一般情况下,Major Compaction时间会持续比较长,整个过程会消耗大量系统资源,对上层业务有比较大的影响。因此线上业务都会将关闭自动触发Major Compaction功能,改为手动在业务低峰期触发。

HBase中可以触发compaction的因素有很多,最常见的因素有这么三种:[b]Memstore Flush、后台线程周期性检查、手动触发。
[/b]
[b]1. Memstore Flush: [/b]应该说compaction操作的源头就来自flush操作,memstore flush会产生HFile文件,文件越来越多就需要compact。因此在每次执行完Flush操作之后,都会对当前Store中的文件数进行判断,一旦文件数# > ,就会触发compaction。需要说明的是,compaction都是以Store为单位进行的,而在Flush触发条件下,整个Region的所有Store都会执行compact,所以会在短时间内执行多次compaction。

[b]2. 后台线程周期性检查: [/b]后台线程CompactionChecker定期触发检查是否需要执行compaction,检查周期为:hbase.server.thread.wakefrequency*hbase.server.compactchecker.interval.multiplier。和flush不同的是,[color=red][b]该线程优先检查文件数#是否大于,一旦大于就会触发compaction。[/b][/color]如果不满足,它会接着检查是否满足major compaction条件,简单来说,如果当前store中hfile的最早更新时间早于某个值mcTime,就会触发major compaction,HBase预想通过这种机制定期删除过期数据。上文mcTime是一个浮动值,浮动区间默认为[7-7*0.2,7+7*0.2],其中7为hbase.hregion.majorcompaction,0.2为hbase.hregion.majorcompaction.jitter,可见默认在7天左右就会执行一次major compaction。[b]用户如果想禁用major compaction,只需要将参数hbase.hregion.majorcompaction设为0[/b]

[b]3. 手动触发:[/b]一般来讲,手动触发compaction通常是为了执行major compaction,原因有三,其一是因为很多业务担心自动major compaction影响读写性能,因此会选择低峰期手动触发;其二也有可能是用户在执行完alter操作之后希望立刻生效,执行手动触发major compaction;其三是HBase管理员发现硬盘容量不够的情况下手动触发major compaction删除大量过期数据;无论哪种触发动机,一旦手动触发,HBase会不做很多自动化检查,直接执行合并。

其实Compaction还是HBase删除过期数据的唯一手段。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值