HBase 支持哪些 Region 拆分策略?
HBase 为了在数据量增长时保持读写性能和负载均衡,会自动将过大的 Region 拆分为两个较小的 Region。决定何时拆分以及在哪里拆分的规则,就是 Region 拆分策略(Split Policy)。
随着 HBase 版本的演进,拆分策略也在不断优化。以下是 HBase 支持的主要 Region 拆分策略:
1. 核心/常见拆分策略(按版本演进顺序)
① ConstantSizeRegionSplitPolicy (固定大小拆分策略)
- 历史地位:HBase 0.94 版本之前的默认策略。
- 拆分逻辑:当一个 Region 中的某个 Store(对应一个列族)下所有 StoreFile(HFile)的总大小超过配置的阈值(
hbase.hregion.max.filesize,默认 10GB)时,就会触发拆分。 - 缺点:对于小表不友好。如果阈值设置很大(10GB),小表可能永远只有一个 Region,无法利用集群的并发能力;如果设置太小,大表又会产生无数个小 Region,导致集群管理压力剧增。
② IncreasingToUpperBoundRegionSplitPolicy (递增上限拆分策略)
- 历史地位:HBase 0.94 到 1.x 版本的默认策略。
- 拆分逻辑:拆分阈值是动态变化的。它与该 Table 在当前 RegionServer 上拥有的 Region 数量(设为
R)有关。- 公式:
Min(R^3 * initialSize, defaultRegionMaxFileSize) initialSize通常是 MemStore 的 flush 大小(默认 128MB)乘以 2。- 举例(假设 flush size 为 128MB,最大限制为 10GB):
- 第 1 个 Region 拆分阈值:
- 第 2 个 Region 拆分阈值:
- 第 3 个 Region 拆分阈值:
- 第 4 个 Region 拆分阈值: -> 超过 10GB,因此固定为 10GB。
- 公式:
- 优点:兼顾了小表和大表。小表能快速分裂出几个 Region 以提高并发;大表在 Region 变多后,分裂阈值变大,避免产生过多 Region。
③ SteppingSplitPolicy (步进拆分策略)
- 历史地位:HBase 2.0 及以后版本的默认策略。
- 拆分逻辑:这是对
IncreasingToUpperBound的简化版本。- 如果当前 RegionServer 上该表只有 1 个 Region,则拆分阈值为 MemStore 的 flush 大小(
hbase.hregion.memstore.flush.size,默认 128MB)。 - 如果有 2 个或更多 Region,拆分阈值直接变成最大文件大小(
hbase.hregion.max.filesize,默认 10GB)。
- 如果当前 RegionServer 上该表只有 1 个 Region,则拆分阈值为 MemStore 的 flush 大小(
- 优点:逻辑更简单。依然能保证小表在初期快速分裂分布到不同的机器上,但避免了
IncreasingToUpperBound策略在 1GB~3GB 阶段频繁拆分带来的资源消耗。
2. 基于 RowKey 业务逻辑的拆分策略
有时候,简单的按大小拆分会从中间截断某个用户的连续数据(例如 RowKey 是 userID_timestamp)。为了保证同一对象的数据在拆分后仍在同一个 Region 内,HBase 提供了以下策略:
④ KeyPrefixRegionSplitPolicy (固定前缀拆分策略)
- 拆分逻辑:除了满足大小条件外,它会保证在 RowKey 的指定长度的前缀边界处进行拆分。
- 配置:需要配置前缀的长度(例如设为 5,则 RowKey 前 5 个字符相同的数据永远不会被分到两个不同的 Region 中)。
⑤ DelimitedKeyPrefixRegionSplitPolicy (分隔符前缀拆分策略)
- 拆分逻辑:类似于上一个,但它不是按固定长度,而是按指定的分隔符来识别前缀。
- 配置:例如 RowKey 是
userid_timestamp,可以配置分隔符为_。HBase 拆分时,会确保同一个userid的数据不会被割裂。
3. 基于负载的特殊拆分策略
⑥ BusyRegionSplitPolicy (热点/繁忙拆分策略)
- 拆分逻辑:这个策略不仅看大小,主要看 负载(请求热点)。如果一个 Region 在一段时间内的请求被阻塞(Blocked Requests)比例过高,说明该 Region 读写非常密集(产生热点),即使它没有达到大小阈值,也会被强制拆分。
- 适用场景:适用于存在严重读写热点的表。
4. 生产环境最推荐的策略
⑦ DisabledRegionSplitPolicy (禁用自动拆分策略)
- 拆分逻辑:完全关闭自动拆分。Region 永远不会自动分裂。
- 适用场景(最佳实践):在成熟的生产环境中,极度推荐这种策略。
- 做法:建表时结合业务数据量评估,手动进行预分区(Pre-splitting),直接建立足够多、分布均匀的 Region。同时关闭自动拆分。
- 原因:自动拆分(Split)是一个非常消耗系统资源(CPU、IO、网络)的过程,且在 Split 期间 Region 会短暂下线。在高并发大吞吐的生产环境中,不可控的自动拆分往往是引发集群性能抖动(甚至故障)的元凶。
如何配置拆分策略?
拆分策略可以全局配置,也可以针对单表配置(单表优先级高于全局)。
1. 全局配置 (在 hbase-site.xml 中)
xml
<property>
<name>hbase.regionserver.region.split.policy</name>
<value>org.apache.hadoop.hbase.regionserver.SteppingSplitPolicy</value>
</property>
2. 表级别配置 (通过 HBase Shell)
可以在建表或修改表时指定:
bash
# 修改已存在的表
hbase> alter 'my_table', {METHOD => 'table_att', CONFIG => {'hbase.regionserver.region.split.policy' => 'org.apache.hadoop.hbase.regionserver.DisabledRegionSplitPolicy'}}
右滑查看面试常问