HBase Region未达配置大小阈值意外分裂触发原因排查
HBase Region意外异常分裂排查方案
问题背景
HBase出现Region意外分裂问题,分裂后各Region大小均不足1G,已知信息如下:
- 核心配置:
- 全局参数
hbase.hregion.max.filesize设置为10g - 配置分裂策略为
SteppingSplitPolicy - 异常表由Phoenix创建,建表指定参数
salt_buckets = 6
- 全局参数
- 参考
SteppingSplitPolicy源码逻辑,初始Region数大于1时,Region大小达到hbase.hregion.max.filesize配置值才会触发分裂:
protected long getSizeToCheck(final int tableRegionsCount) { return tableRegionsCount == 1 ? this.initialSize : getDesiredMaxFileSize(); }
- 实际异常现象:表初始Region数量为6,当前已分裂为18个Region,总数据量仅7.62GB,各Region存储文件统计如下:
StorefileSize(7.62 GB) Num.Storefiles(34) 212 MB 1 255 MB 1 830 MB 3 213 MB 1 482 MB 1 601 MB 4 213 MB 1 354 MB 1 ... ...
7月4日进展更新
- 已尝试更换分裂策略为
ConstantSizeRegionSplitPolicy,仍出现相同的异常分裂现象。 - 问题仅出现在Apache原生组件搭建的测试环境,该环境长期存在CPU、内存资源不足的情况;使用HDP发行版组件的预生产环境配置
SteppingSplitPolicy策略运行正常,两套环境核查后绝大多数配置项一致。目前问题暂因其他工作安排搁置,后续将继续深入排查。
根因定位排查路径
按优先级从高到低推进:
- 拉取对应RegionServer运行日志,搜索
split requested、Splitting region关键字,日志会直接记录每次分裂的触发源、触发时读取的分裂阈值、判定的当前Region实际大小。先确认分裂触发路径:是分裂策略判定触发,还是手动执行split命令、HBCK修复强制分裂、Phoenix表操作隐式触发。重点核对日志中记录的阈值大小、Region计算大小是否符合预期,是否存在单位换算错误、大小统计维度错误(比如重复计算多列族大小、把MemStore大小错误计入判定值)。 - 检查表级配置是否覆盖全局参数。HBase支持表级别自定义配置覆盖全局默认值,执行HBase Shell命令
describe '异常表名',查看表CONFIGURATION段是否单独配置了更小的分裂阈值、是否覆盖了分裂策略类,Phoenix建表时可能隐式注入表级参数,和全局配置不一致。 - 排查资源不足触发的异常分裂。测试环境存在CPU、内存资源不足问题,重点确认两个逻辑:
- 部分HBase版本存在当Region内StoreFile数量超过阈值时触发分裂的逻辑,和Region大小阈值无关,内存吃紧时MemStore刷盘频率陡增,会导致StoreFile数量快速上涨触发这类分裂。
- 检查低优先级操作调度逻辑,资源不足时部分版本的调度器会错误触发自动分裂流程。
- 对比Apache原生版本与HDP发行版的代码差异。HDP发行版对HBase分裂逻辑打过自研补丁,重点对比两个版本中
RegionSplitPolicy抽象类、SteppingSplitPolicy、ConstantSizeRegionSplitPolicy实现类的源码,确认原生版本是否存在已知的大小计算bug:比如多列族场景下大小重复计算、分裂判定使用未压缩的原始数据大小而非磁盘实际存储大小——当前统计的7.62GB是压缩后的StoreFile大小,若判定逻辑用未压缩大小计算,可能出现磁盘占用远小于阈值但判定值超标的情况。 - 核查Phoenix盐表的隐式配置。检查当前使用的Phoenix版本是否存在盐表自动分裂的内置逻辑,是否默认开启
phoenix.autosplit相关参数,建表时是否隐式设置了和分裂相关的表级参数。
内容的提问来源于stack exchange,提问作者Steven
相关产品推荐
相关产品推荐

