下列三个条件可能会触发compaction请求:
1. memstore flush之后触发;
2. 客户端通过shell或者API触发;3. 后台线程CompactionChecker定期触发,周期为:hbase.server.thread.wakefrequency*hbase.server.compactchecker.interval.multiplier。
触发了compaction请求后,真正的compaction操作能否执行,还有进行一系列的条件验证。在此只对众多条件中的一种做以记录,即由hbase.hregion.majorcompaction和hbase.hregion.majorcompaction.jitter控制的一组条件。这是一个store是否需要major compaction的一组验证条件,hbase.hregion.majorcompaction表示一个基数,hbase.hregion.majorcompaction.jitter表示一个比率,在0.96.2中,前者默认为7天,后者默认为0.2。
此条件的验证逻辑为:
1. 在hbase.hregion.majorcompaction的上下浮动区间hbase.hregion.majorcompaction*hbase.hregion.majorcompaction.jitter中,得到的一个随机值mcTime,在0.96.2中,mcTime的值为[7-7*0.2天,7+7*0.2天);
2. 获取一个store中所有storefile的最晚更新时间lowTimestamp。如果该store中没有storefile,说明不需要进行major compaction,结束本次验证;
3. 如果距当前时间的mcTime时段以内,没有文件被修改,即lowTimestamp < (当前时间 - mcTime),则转向4,否则说明不需要进行major compaction,结束本次验证;
4. 如果该store中有多个storefile,则表示需要进行major compaction。否则说明只有一个storefile,转向5;
5. 如果storefile中包含满足TTL条件的数据,则需要进行major compaction,否则不需要。
上述验证逻辑可见0.96.2的RatioBasedCompactionPolicy#isMajorCompaction方法。