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操作