HBase的文件合并(minor/major compact)

Minor Compact
  Minor Compact是指少量HFile文件按照Minor Compact规则进行合并;它的正常流程是这样的,探测到有新的文件刷进来(比如因为memstore的flush,当然可以直接写入HFile而跳过memstore,比如Bulk写入),此时Region Server只要发现同一个列簇有3个及以上的文件,将会扫描文件列表,然后将符合合并规则文件纳入到list中,并且list中文件数>1,则将会进行compact;其中规则如下:

  1. 文件大小小于min.size的放入到list中;
  2. 文件大小大于max.size的将一定不会放入到list中;
  3. 如果文件大小排序,该文件大小小于后面10个文件总大小*1.2(说明文件不是足够),那么就放入到list中;这里10是由hbase.hstore.compaction.max决定,1.2是由hbase.hstore.compaction.ratio决定的。

所以看到minor的规则稍微有点复杂,原则是减少合并(文件合并要门当户对),避免形成大文件(达到一定程度之后就不在合并)。
  另外minor compact在合并文件过程中,只是数据进行排序,但是并不会执行物理删除,比如墓碑文件标记的删除数据,TTL超期清理数据,以及超出多版本阈值的数据清理。这些工作什么时候去做呢?
Major Compact
  数据清理的工作,都是在Major Compact里面去做,Major操作是无差别的将所有的同一个column family的所有文件进行合并;在合并的过程中将会对数据进行清理,那些需要删除掉的,过期的数据都会在Major Compact里面去做,当然也包括整合数据排序(HBase的数据排序是字段顺序)。所以Major Compact在数据层面做的事情还是挺多的,但是因为他产生的IO消耗同样非常巨大,所以一般都会禁用自动major compact,而是会手工进行数据合并。

参考:
https://blog.csdn.net/u014297175/article/details/50456147

相关推荐