HBase compact

1 Compact的方式

      HBase MemStore每次进行Flush操作都会产生新的HFile文件,文件越来越多,会带来读性能问题, HBase使用Compact机制来解决这个问题。 HBase的Compact分两种minor compact 和major compact。

  •  Minor compact

   将一些小的文件合并成大的文件;

  结果是文件数变少

  合并过程中进行排序;

  不清理历史数据和过期版本(待确认)

   较小的IO,速度快

  • Major compact

      将每个column family中所有的HFfile 进行合并重写为一个文件;

     合并过程中会删除过期的cell;(待确认)

     合并过程清除标记为Deleted的cell;

     合并过程丢弃超过最大版本的cell;

     结果是每个Column family 一个Hfile;

      提高读性能;

     因为要重写所有的文件,有大量的IO操作,可能会带来网络的性能问题;

    一般安排在周末或者凌晨负载小的时候进行

 过期的cell到底在minor还是major里删除尚待确认:

 

在  the  Apache HBase ™ Reference Guide(http://hbase.apache.org/book.html) 中有两处看似矛盾的地方: 

 

39. Time To Live (TTL)

 

ColumnFamilies can set a TTL length in seconds, and HBase will automatically delete rows once the expiration time is reached. This applies to all versions of a row - even the current one. The TTL time encoded in the HBase for the row is specified in UTC.

 

Store files which contains only expired rows are deleted on minor compaction. 

  

70.7.7. Compaction

 

.....

 

Minor compactions usually select a small number of small, adjacent StoreFiles and rewrite them as a single StoreFile. 

 

Minor compactions do not drop (filter out) deletes or expired versions, because of potential side effects. 

 

 如果这两处的expored 都是指TTL的话,那么TTL过期的到底在哪里删除的呢?

 

2 minor compact详解

 

  主要依赖于如下几个参数: 

  • hbase.hstore.compaction.min :默认值为 3,(老版本是:hbase.hstore.compactionThreshold),即store下面的storeFiles数量 减去 正在compaction的数量 >=3是,需要做compaction
  • hbase.hstore.compaction.max 默认值为10,表示一次minor compaction中最多选取10个store file
  • hbase.hstore.compaction.min.size 表示文件大小小于该值的store file 一定会加入到minor compaction的store file中
  • hbase.hstore.compaction.max.size 表示文件大小大于该值的store file 一定会被minor compaction排除

    Minor compact条件:  HStore中StoreFIles的个数 – 正在执行Compacting的文件个数 > minFilesToCompact (上面图表默认值为3)

       compact由region server上的单独线程CompactionChecker执行轮询检查,判断哪些HStore下的store file 需要进行compact,具体的判断算源代码如下:

 publicboolean needsCompaction(final Collection<StoreFile> storeFiles,
   final List<StoreFile> filesCompacting) {
   int numCandidates = storeFiles.size() - filesCompacting.size();
   return numCandidates >= comConf.getMinFilesToCompact();
  }

      因为一个HStore对应一个column family,而且从查看HBase表在HDFS中的文件结构可以知道一个column family 对应HDFS上的一个文件夹,所这个线程其实就是扫描每一个column family对应的目录决定哪个目录下的文件需要进行compact。

   当确定要进行minor compact的时候,HBase使用smart算法对storefile进行compact。smart算法如下:

   HBase将队列中的Storefile进行排序(older to younger), 从older storefile进行选择:

  (1) 如果storefile的大小小于hbase.hstore.compaction.min.size(为memstoreFlushSize),则一定加入到合并队列中

(2)如果storefile的大小大于hbase.hstore.compaction.max.size(为memstoreFlushSize),则一会被排除,这个值比较大一般达不到

(3)如果storefile的size小于后边hbase.hstore.compaction.max(默认10)个文件大小总和的ratio倍(配置项是hbase.hstore.compaction.ratio,默认为1.2),则文件一定会加入到合并队列中

   想了解合并的实例,可以参考(http://blog.csdn.net/u014297175/article/details/50456147)

 

 

参考文献:

https://mapr.com/blog/in-depth-look-hbase-architecture/

http://www.cnblogs.com/tgzhu/p/5859014.html

http://blog.csdn.net/liyanyun/article/details/20134417

http://blog.csdn.net/u014297175/article/details/50456147

posted on 2017-09-14 17:32  yanzibuaa  阅读(1851)  评论(0编辑  收藏  举报