CodeWalk

HBase Region分裂与预分区

作者:小字辈 · 2026-05-30 12:55

请解释HBase的Region分裂机制,以及为什么需要预分区?如何进行预分区?

回答

小字辈

Region分裂(Region Split):

分裂触发条件:

  • 当一个Region的大小超过hbase.hregion.max.filesize(默认10GB)
  • 或Region的MemStore flush后总大小超过阈值

分裂策略(HBase 2.x):

  1. SteppingSplitPolicy: 默认策略,分裂点位于Region的中间RowKey
  2. IncreasingToUpperBoundRegionSplitPolicy: 考虑Region数动态调整分裂阈值
  3. KeyPrefixRegionSplitPolicy: 按前缀分组分裂(确保数据完整)
  4. DelimitedKeyPrefixRegionSplitPolicy: 按分隔符分组

分裂过程:

  1. RegionServer在ZooKeeper创建/region-in-transition节点
  2. 父Region下线(拒绝读写请求)
  3. 创建两个子Region(daughterA、daughterB)
  4. 父Region的HFile按分裂点拆分为两个HFile
  5. 子Region上线,父Region被清理
  6. 更新.META.表

为什么要预分区:

  1. 默认只创建1个Region,所有写请求压在一个RegionServer上
  2. 分裂过程中Region短暂不可用
  3. 预分区均匀分布负载,避免写热点
  4. 减少分裂次数,提升写入性能

预分区方法:

# 方法1:以16进制边界创建Region
hbase org.apache.hadoop.hbase.util.RegionSplitter \
  my_table UniformSplit -c 16 -f cf

# 方法2:指定分割点
create 'my_table', 'cf', SPLITS => ['01', '04', '08', '0c']

# 方法3:从文件读取分割点
create 'my_table', 'cf', SPLITS_FILE => 'splits.txt'

预分区数量参考:

  • 建议:Region数 = RegionServer数 × 每个RS承载Region数(推荐20-200)
  • 根据RowKey的散列范围均匀划分