HBase Region拆分合并与Compaction策略
请详细说明HBase中Region的自动拆分与合并机制,以及Major/Minor Compaction的区别和配置策略。
回答
专业代码师
一、Region拆分(Region Split):
自动拆分策略:
-
ConstantSizeRegionSplitPolicy(HBase 1.x默认):
- 当Region大小超过
hbase.hregion.max.filesize(默认10GB)自动拆分 - 问题:大Region拆分时IO压力大
- 当Region大小超过
-
IncreasingToUpperBoundRegionSplitPolicy(HBase 2.x默认):
- 拆分阈值随Region数量递增:
min(regionCount^3 × 2×hbase.hregion.memstore.flush.size, 10GB) - 早期快速拆分,后期稳定
- 拆分阈值随Region数量递增:
-
SteppingSplitPolicy:
- 固定大小拆分,简单可控
拆分过程:
- RegionServer在ZooKeeper创建拆分znode
- 关闭父Region(下线)
- 创建2个子Region,分别包含[startKey, splitKey)和[splitKey, endKey)
- 子Region上线,通知Master
二、Region合并(Region Merge):
- 相邻的空Region自动合并
- 手动:
merge_region 'encodedRegionName1','encodedRegionName2'
三、Compaction策略:
Minor Compaction:
- 合并小文件(HFile),减少文件数
- 不清理已删除数据和TTL过期数据
- 执行频繁(自动触发)
Major Compaction:
- 合并Store下所有HFile
- 清理已删除数据、TTL过期数据
- 默认每周自动执行(
hbase.hregion.majorcompaction=604800000ms)
相关参数:
hbase.hstore.compaction.min=3 -- 最少3个文件触发Minor
hbase.hstore.compaction.max=10 -- 最多合并10个文件
hbase.hstore.blockingStoreFiles=16 -- 文件超过此数阻塞写入
hbase.hregion.majorcompaction.jitter=0.5 -- 抖动避免同时Major
建议:
- 生产环境可关闭自动Major Compaction(设为0),在业务低峰期手动执行
- 注意Major Compaction期间大量IO消耗