订阅更新

HBase Region Split 和 Compaction 有什么区别?

面试问 181 约 3 分钟读完

本文目录
  1. 面试怎么回答
  2. Region Split 拆的是服务范围
  3. Compaction 合的是 StoreFile
  4. Minor 和 Major Compaction 的边界
  5. 为什么 Split 后仍可能继续 Compaction
  6. 一个典型场景
  7. 参考资料

面试怎么回答

Region Split 按 RowKey 边界把一个 Region 拆成两个,改变的是 Key Range、服务路由和负载分布;Compaction 在同一 Store 内合并 StoreFile,控制读放大,并在 Major Compaction 中清理 Tombstone、TTL 和旧版本。Split 后底层文件还可能通过 Reference 共享,后续 Compaction 才逐步重写,因此两者职责不同且会相互衔接。

先把这段讲顺;面试官追问时,再展开下面的原理和细节。

详细讲解

Region 变大就 Split,StoreFile 变多就 Compaction。

这两个动作经常同时出现,于是很多人误以为它们都在做文件整理。

Region Split 拆分 Key Range 以扩展并行与分布,Compaction 合并 StoreFile 以控制读放大和清理历史,两者解决不同层级的问题。


Region Split 拆的是服务范围

HBase 表按连续 RowKey Range 划分为 Region。Region 达到策略阈值后,RegionServer 选择 Split Point,原 Region 下线并生成两个 Daughter Region,再更新 hbase:meta 供客户端发现。它让数据范围可以分布到更多 RegionServer。

Compaction 合的是 StoreFile

MemStore Flush 会不断产生新的 StoreFile。读一个 Key Range 可能需要检查多个文件,形成读放大。Compaction 在同一个 Column Family 的 Store 内选择多个 StoreFile 合并成更少、更大的文件,降低文件数量并改善读取。

Minor 和 Major Compaction 的边界

Minor Compaction 通常选择部分 StoreFile 合并,控制日常读放大和写放大。Major Compaction 会重写更完整的 Store 文件集合,并有机会真正清理被 Tombstone 遮蔽的数据、过期 TTL 和超出版本数的数据,但 I/O 消耗更大,不应在高峰无控制地触发。

Split 与 Compaction 改变的对象不同

为什么 Split 后仍可能继续 Compaction

Split 不一定立即重写全部底层文件,新 Daughter Region 可以先通过 Reference 指向父 Region 文件的对应范围,后续由 Compaction 逐步重写并清理引用。因此 Split 解决范围和负载,底层文件整理仍需要 Compaction 完成。

一个典型场景

时间递增 RowKey 让写入持续命中最后一个 Region。即使自动 Split,热点也会不断追到最新 Region;同时频繁 Flush 产生大量 StoreFile,引发 Compaction 压力。真正的解决方案要先改善 RowKey 分布,再合理预分区和控制 Flush、Compaction,而不是只调大 Region 阈值。

写入增长后的维护链路

参考资料

刷题进度保存在当前浏览器