HBase中的Compaction详解

Compaction的作用

        由于memstore每次刷写都会生成一个新的HFile,且同一个字段的不同版本(timestamp)和不同类型(Put/Delete)有可能会分布在不同的 HFile 中,因此查询时需要遍历所有的 HFile。为了减少 HFile 的个数,以及清理掉过期和删除的数据,会进行 StoreFile Compaction。

Compaction的分类

HBase中的Compaction详解_第1张图片

Minor Compaction:

Minor Compaction会将临近的若干个较小的 HFile 合并成一个较大的 HFile,但不会清理过期和删除的数据

Major Compaction:

Major Compaction 会将一个 Store 下的所有的 HFile 合并成一个大 HFile,并且会清理掉过期和删除的数据。

注意:当文件数超过三个时,手动Compact和Major Compact实现的效果是一样的

Compaction的流程

  1. HBase启动一个独立线程从对应的Store中选取要合并的HFile;
  2. 从这些HFile中依次读出KeyValue,进行归并排序处理写到./tmp目录下的临时文件;
  3. 将临时文件移动到Store的数据目录;
  4. 将Compation的输入文件路径和输出文件封装成KeyValue写入HLog,并标记为Compation,强行执行sync;
  5. 合并成新的HFile取代之前的HFile对外提供服务;
  6. 删除已经被合并的HFile文件。

 

触发时机

  • MemStore Flush:每次MemStore Flush都会检查当前Store的文件数量,如果达到阈值则触发Compaction,此时整个Region的所有Store都会执行Compact检查;
  • 后台周期性检查:后台线程CompactionChecker定期触发检查对应的Store是否需要执行Compation,先检查Store的文件数量然后检查是否满足Major Compation条件(默认7天执行一次);
  • 手动触发;

你可能感兴趣的:(HBase,hbase,数据库,大数据)