Skip to content

StoreFile合并

1. StoreFile合并简介

由于Memstore每次刷写都会生成一个新的HFile,文件过多读取不方便,所以会进行文件的合并,清理掉过期和删除的数据,会进行StoreFile Compaction。合并分为两种,分别是Minor Compaction(小合并)和Major Compaction(大合并)。

  • Minor Compaction会将临近的若干个较小的HFile合并成一个较大的HFile,并清理掉部分过期和删除的数据,有系统使用一组参数自动控制。
  • Major Compaction会将一个Store下的所有的HFile合并成一个大HFile,并且会清理掉所有过期和删除的数据,由参数 hbase.hregion.majorcompaction控制,默认7天。

下图为小大合并的流程:
Alt text

2. Minor Compaction控制机制

参与到小合并的文件需要通过参数计算得到,有效的参数有5个:
(1)hbase.hstore.compaction.ratio(默认 1.2F)合并文件选择算法中使用的比率。
(2)hbase.hstore.compaction.min(默认 3)为Minor Compaction的最少文件个数。
(3)hbase.hstore.compaction.max(默认 10)为Minor Compaction最大文件个数。
(4)hbase.hstore.compaction.min.size(默认128M)为单个Hfile文件大小最小值,小于这 个数会被合并。
(5)hbase.hstore.compaction.max.size(默认Long.MAX_VALUE)为单个Hfile文件大小最大值,高于这个数不会被合并。

3. Minor Compaction条件

小合并机制为拉取整个store中的所有文件,做成一个集合。之后按照从旧到新的顺序遍历。判断条件为:
① 过小合并,过大不合并(也就是说大合并的结果文件不会出现在小合并中)
② 文件大小/hbase.hstore.compaction.ratio < (剩余文件大小和)则参与压缩。所有把比值设置过大,如10会最终合并为1个特别大的文件,相反设置为0.4,会最终产生4个storeFile。不建议修改默认值
③ 满足压缩条件的文件个数达不到个数要求(3 ≤ count ≤ 10)则不压缩。