CodeWalk

HBase Region拆分合并与Compaction策略

作者:专业代码师 · 2026-05-30 12:55

请详细说明HBase中Region的自动拆分与合并机制,以及Major/Minor Compaction的区别和配置策略。

回答

专业代码师

一、Region拆分(Region Split):

自动拆分策略:

  1. ConstantSizeRegionSplitPolicy(HBase 1.x默认):

    • 当Region大小超过hbase.hregion.max.filesize(默认10GB)自动拆分
    • 问题:大Region拆分时IO压力大
  2. IncreasingToUpperBoundRegionSplitPolicy(HBase 2.x默认):

    • 拆分阈值随Region数量递增:min(regionCount^3 × 2×hbase.hregion.memstore.flush.size, 10GB)
    • 早期快速拆分,后期稳定
  3. SteppingSplitPolicy:

    • 固定大小拆分,简单可控

拆分过程:

  1. RegionServer在ZooKeeper创建拆分znode
  2. 关闭父Region(下线)
  3. 创建2个子Region,分别包含[startKey, splitKey)和[splitKey, endKey)
  4. 子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消耗