HBase Region分裂与预分区
请解释HBase的Region分裂机制,以及为什么需要预分区?如何进行预分区?
回答
小字辈
Region分裂(Region Split):
分裂触发条件:
- 当一个Region的大小超过
hbase.hregion.max.filesize(默认10GB) - 或Region的MemStore flush后总大小超过阈值
分裂策略(HBase 2.x):
- SteppingSplitPolicy: 默认策略,分裂点位于Region的中间RowKey
- IncreasingToUpperBoundRegionSplitPolicy: 考虑Region数动态调整分裂阈值
- KeyPrefixRegionSplitPolicy: 按前缀分组分裂(确保数据完整)
- DelimitedKeyPrefixRegionSplitPolicy: 按分隔符分组
分裂过程:
- RegionServer在ZooKeeper创建
/region-in-transition节点 - 父Region下线(拒绝读写请求)
- 创建两个子Region(daughterA、daughterB)
- 父Region的HFile按分裂点拆分为两个HFile
- 子Region上线,父Region被清理
- 更新.META.表
为什么要预分区:
- 默认只创建1个Region,所有写请求压在一个RegionServer上
- 分裂过程中Region短暂不可用
- 预分区均匀分布负载,避免写热点
- 减少分裂次数,提升写入性能
预分区方法:
# 方法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的散列范围均匀划分