一、LSM结构与数据合并背景
LSM写流程
数据先写入内存的MemTable,达到阈值后刷盘成不可变的SSTable文件。
合并必要性
多次写入会产生多个SSTable,导致查询时需要合并多个文件(影响性能),且冗余数据占用存储空间。
二、合并触发条件
Paimon通过以下条件触发合并,源码中对应CompactManager类(路径:paimon-core/src/main/java/org/apache/paimon/compact/CompactManager.java):
1. 自动触发条件
SSTable数量阈值
当某层(Level)的SSTable数量超过compaction.max.file-num(默认50)时触发合并。
// CompactManager.java
public boolean shouldWaitCompaction() {
return currentFileCount() > maxFileNum;
}
写入检查点(Checkpoint)
在Flink的检查点机制中,Paimon会调用snapshotState()方法,触发异步合并。
// AbstractFileStoreWriteOperator.java
public void snapshotState(StateSnapshotContext context) throws Exception {
compactManager.tr