面试题答案
一键面试Minor Compaction
- 触发条件:
- 当MemStore达到一定阈值(
hbase.hregion.memstore.flush.size
,默认128MB)时,会触发MemStore的Flush操作,生成HFile。当一个Region中HFile的数量达到一定数量(hbase.hstore.compaction.min
,默认3)时,会触发Minor Compaction。
- 当MemStore达到一定阈值(
- 执行过程:
- 从当前Region的Store中选取部分较小的HFile(选取数量由
hbase.hstore.compaction.min
和hbase.hstore.compaction.max
控制,默认最小3个,最大10个)。 - 将这些HFile中的数据按Key排序合并,相同Key的数据会合并,新的数据会覆盖旧的数据。
- 合并后生成一个新的HFile,然后删除参与合并的旧HFile。
- 从当前Region的Store中选取部分较小的HFile(选取数量由
- 对HFile物理结构优化的作用:
- 减少HFile的数量,降低读操作时需要检索的文件数量,提高读性能。
- 合并相同Key的数据,减少数据冗余,优化存储结构。
Major Compaction
- 触发条件:
- 手动触发,通过HBase shell命令
major_compact
。 - 自动触发,每个Region的Store有一个
hbase.hregion.majorcompaction
参数(默认7天),表示自动执行Major Compaction的周期。当达到这个周期时,会触发Major Compaction。 - 当一个HFile的年龄超过
hbase.hstore.majorcompaction.age
(默认0,即不启用该功能)时,也会触发Major Compaction。
- 手动触发,通过HBase shell命令
- 执行过程:
- 选取当前Region的Store中的所有HFile。
- 将所有HFile中的数据按Key排序合并,相同Key的数据合并,新的数据覆盖旧的数据。
- 合并后生成一个新的HFile,然后删除所有参与合并的旧HFile。
- 对HFile物理结构优化的作用:
- 彻底合并所有HFile,完全消除数据冗余,极大地优化存储结构。
- 清理被标记为删除的数据(墓碑标记),释放磁盘空间。
高写入负载场景下Compaction策略选择
- 优先使用Minor Compaction:
- 在高写入负载场景下,频繁的Major Compaction会带来较大的I/O开销,影响系统性能。Minor Compaction由于只合并部分HFile,I/O开销相对较小。可以适当调整
hbase.hstore.compaction.min
和hbase.hstore.compaction.max
参数,比如将hbase.hstore.compaction.min
设置为2 - 3,这样可以更频繁地进行Minor Compaction,减少HFile数量,同时又不会带来过高的I/O开销。
- 在高写入负载场景下,频繁的Major Compaction会带来较大的I/O开销,影响系统性能。Minor Compaction由于只合并部分HFile,I/O开销相对较小。可以适当调整
- 调整Major Compaction周期:
- 适当延长Major Compaction的周期,比如将
hbase.hregion.majorcompaction
从默认的7天延长到14天甚至更长,减少高写入负载场景下Major Compaction对系统性能的影响。但要注意,如果周期过长,数据冗余和墓碑数据可能会积累过多,影响存储效率和读性能。
- 适当延长Major Compaction的周期,比如将
- 启用增量Major Compaction:
- 可以启用增量Major Compaction(通过设置
hbase.hstore.incremental.majorcompaction
为true
),增量Major Compaction不会一次性合并所有HFile,而是每次选择一部分HFile进行合并,逐步完成所有HFile的合并,这样可以在一定程度上平衡性能和存储优化。
- 可以启用增量Major Compaction(通过设置