CodeWalk

HBase Compaction机制

作者:苦行僧 · 2026-05-30 12:55

请解释HBase中的Compaction机制,包括Minor Compaction和Major Compaction的区别,以及如何配置Compaction策略。

回答

苦行僧

Compaction定义: HBase后台合并HFile的过程,解决HFile数量过多导致的读取性能下降问题。

Minor Compaction(小合并):

  • 触发: HFile数量超过hbase.hstore.compaction.min(默认3)
  • 范围: 选择少量HFile进行合并
  • 特点:
    • 合并后不清理已删除/过期的数据
    • 执行频率高,IO开销小
    • 通常选择大小相近的文件合并
  • 策略: 默认使用RatioBasedCompactionPolicy

Major Compaction(大合并):

  • 触发:
    • 定期执行(hbase.hregion.majorcompaction,默认7天)
    • 手动触发:major_compact 'table_name'
  • 范围: 合并一个Region中所有HFile
  • 特点:
    • 清理已删除/过期的数据(TTL过期/版本超限)
    • 合并所有StoreFile为一个HFile
    • IO开销极大(读写整个Region的数据)
    • 生产环境建议关闭自动Major Compaction,选择业务低峰期手动执行

Compaction配置:

<!-- 触发Minor的最小文件数 -->
<property><name>hbase.hstore.compaction.min</name><value>3</value></property>
<!-- 触发Minor的最大文件数 -->
<property><name>hbase.hstore.compaction.max</name><value>10</value></property>
<!-- Minor选择文件的比例阈值(RatioBased)-->
<property><name>hbase.hstore.compaction.ratio</name><value>1.2</value></property>
<!-- 关闭自动Major Compaction -->
<property><name>hbase.hregion.majorcompaction</name><value>0</value></property>

Compaction策略(HBase 2.x):

  1. RatioBasedCompactionPolicy(默认):基于文件大小的比例选择
  2. StripeCompactionPolicy:将Region分为多个Stripe,减少Compaction范围
  3. FIFOCompactionPolicy:仅保留最新数据,适合TTL场景
  4. DateTieredCompactionPolicy:按时间分层Compaction

最佳实践:

  • 关闭自动Major Compaction,手动定期执行
  • 设置hbase.hregion.majorcompaction=0
  • 在凌晨低峰期使用Cron执行Major Compaction