compact的类型
- Minor Compact 合并一部分小文件,不会处理标记删除,过期的数据
- Major Compact 合并所有的文件,处理标记删除,过期的数据,一般会关闭自动合并,在低峰时期手动合并
触发的时机
- MemoryStore flush时,发现storefile的数量大于某个阈值时
- 后台程序定时检查,首先检查是否满足上面的条件,然后在检查最早的时间是否是7天前的,然后执行Major Compact
- 手动触发,无论minor compact 还是 major compact 都可以手动
合并流程
如上图:
- 由于上面原因触发
- 选择hfile,主要是希望合并IO 负载重 ,容量小的文件
- 挑选合适的线程池
- 执行合并
选择HFile策略
排除HFile识别合并类型
- 排除正在合并的文件及比它新的文件,因为他们都可能需要合并
- 排除某些过大的文件
识别合并类型
- 是否手动强制major 合并
- 长时间未合并,并待选文件小10个
- 含有reference文件,因为这种文件时split产生的,需要major处理后才能去做monior 合并
如果以上要求都不满足就是minor 合并
Minor 合并的选取文件策略
RatioBasedCompactionPolicy
从老到新扫描文件然后找到一个 hfile size < 更新的file的总和 * ratio,这样就可以从这个界限比它更新的文件
其实就是总文件的一个占比,然后合并这个占比的小文件
ExploringCompactionPolicy
在以上的基础上选择最后的一个位置(待验证,不理解)
选择线程池
compact 和 split 动作 由一个统一的线程进行处理CompactSplitThead,这个线程构造了small copaction线程池,large compaction 线程池,根据合并总文件的大小是否大于throttlePoint进行选择
开始合并
- 由旧到新扫描KV复制到一个临时目录/.tmp ,此时还没有合并
- 将临时目录的数据拷贝到region目录下
- 将合并的输入文件路径和输出文件路径写入WAL,然后合并(为了合并失败的情况能删除临时数据)
- 最后将region目录中的输入文件删除