hbase compact和split策略

---compact split笔记

 

compact策略:

在启动region之后,memflush之后,用户compact调用compact

使用策略类needsCompaction方法,hfile数量大于hbase.hstore.compaction.min 和 hbase.hstore.compactionThreshold的最大值数(默认值为3)

 

major compact触发:(hfile由mem flush生成)

HStore检查是否进行compact时候,现在now - 上次major时间大于hbase.hregion.majorcompaction下次时间间隔  =》 hfile个数大于1 || 只有一个hfile(最早的ts>ttl)整个文件过期 => 进行marjor compact

hbase shell和admin进行major_compact

compact file <= sum(hfile) * hbase.hstore.compaction.ratio 将small compact转为major compact

最小的tts到时间了,进行major compact

 

 

compact策略:(一次compact不会compact提供所有的hfile,会选择最好的一组)

ExploringCompactionPolicy

一、选择符合要求的一组hfile进行compact

1.hfile数>=minFiles

2.hfile数<=maxFiles

3.sum(hfile)大小<=hbase.hstore.compaction.max

4.一个hfile大小<sum(hfile)-hfile(不让一个hfile过大)

二、选择最优解(最优的一组hfile)

选择sum(hfile)大小最小的作为第一个组合,选择能合并更多的hfile,并且sum(hfile)大小更小的

 

 split触发:

1.flush之前会检测区域中HStoreFile数目是否超过hbase.hstore.blockingStoreFiles,如果超过且没有等待超时会调用CompactSplitThread.requestSplit(HRegion) 

2.flush之后会调用HRegion.checkSplit()检测是否需要split,如果需要则调用CompactSplitThread.requestSplit(HRegion)

3.compact之后会调用CompactSplitThread.requestSplit(HRegion)

4.hbaseadmin split table or region

 

split策略:

IncreasingToUpperBoundRegionSplitPolicy

(init)initialSize = hbase.increasing.policy.initial.size(预先设置初始值大小) 或hbase.hregion.memstore.flush.size (memflush大小)

获取this.region所在表的所有region数 getCountOfCommonTableRegions 为regioncount

当regioncount在0到100之间,取配置hbase.hregion.max.filesize(默认10G)或initialSize*(regioncount^3)的最小值  否则取配置hbase.hregion.max.filesize(默认10G)

如,只有一个region,128*1^3=128M

        之后:                 128*2^3=1024M

                                    128*3^3=3456M

                                    128*4^3=8192M

                                    128*5^3=16000M(15G) => 10G 当有5个region就可以用配了

结论:

compact

无法避免,

增大hbase.hstore.compaction.min 和 hbase.hstore.compactionThreshold可以减少compact频率,但是延迟compact时间,反之亦然

通过减少生成hfile数量减少compact,

通过设置较大的hbase.hregion.majorcompaction可以减少marjor compact频率

可以定时人为进行mar compact

split

可以避免,split可以只设置hbase.hregion.max.filesize很大就停止了region split操作

猜你喜欢

转载自blackproof.iteye.com/blog/2185465