HBase Compaction机制
请解释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):
- RatioBasedCompactionPolicy(默认):基于文件大小的比例选择
- StripeCompactionPolicy:将Region分为多个Stripe,减少Compaction范围
- FIFOCompactionPolicy:仅保留最新数据,适合TTL场景
- DateTieredCompactionPolicy:按时间分层Compaction
最佳实践:
- 关闭自动Major Compaction,手动定期执行
- 设置
hbase.hregion.majorcompaction=0 - 在凌晨低峰期使用Cron执行Major Compaction