Compaction的作用
由于memstore每次刷写都会生成一个新的HFile,且同一个字段的不同版本(timestamp)和不同类型(Put/Delete)有可能会分布在不同的 HFile 中,因此查询时需要遍历所有的 HFile。为了减少 HFile 的个数,以及清理掉过期和删除的数据,会进行 StoreFile Compaction。
Compaction的分类
Minor Compaction:
Minor Compaction会将临近的若干个较小的 HFile 合并成一个较大的 HFile,但不会清理过期和删除的数据
Major Compaction:
Major Compaction 会将一个 Store 下的所有的 HFile 合并成一个大 HFile,并且会清理掉过期和删除的数据。
注意:当文件数超过三个时,手动Compact和Major Compact实现的效果是一样的
Compaction的流程
- HBase启动一个独立线程从对应的Store中选取要合并的HFile;
- 从这些HFile中依次读出KeyValue,进行归并排序处理写到./tmp目录下的临时文件;
- 将临时文件移动到Store的数据目录;
- 将Compation的输入文件路径和输出文件封装成KeyValue写入HLog,并标记为Compation,强行执行sync;
- 合并成新的HFile取代之前的HFile对外提供服务;
- 删除已经被合并的HFile文件。
触发时机
- MemStore Flush:每次MemStore Flush都会检查当前Store的文件数量,如果达到阈值则触发Compaction,此时整个Region的所有Store都会执行Compact检查;
- 后台周期性检查:后台线程CompactionChecker定期触发检查对应的Store是否需要执行Compation,先检查Store的文件数量然后检查是否满足Major Compation条件(默认7天执行一次);
- 手动触发;