问题: 量大导致compact太久或者没compact时下游读取太慢 如何解决
减少 update/delete 数量 上游先按主键合并,只把同一 key 的最后一次变更写入 Paimon
比如同一个主键 1 分钟内更新 20 次,直接写 Paimon 就是 20 条变更,compact 要处理 20 个版本。
如果业务允许,先在 Flink 上游按主键做 mini-batch 合并,只保留最后一条
提高 compact 并行度 增加 bucket 数,避免单 partition / 单 bucket 过大
拆出独立 compact 任务 写入任务只写,compact 用独立 Flink job 跑
避免频繁 full compaction 检查 full-compaction.delta-commits 和 compact action 模式
'num-sorted-run.compaction-trigger' = '5'
'num-sorted-run.stop-trigger' = '8'
'full-compaction.delta-commits'
num-sorted-run.compaction-trigger sorted run 数达到多少触发 compact
num-sorted-run.stop-trigger backlog 太多时是否阻塞写入等待 compact
减少 changelog 负担 不需要 changelog 就用 changelog-producer=none
调整文件和 buffer 增大 write-buffer-size,合理设置 target-file-size
改数据模型 大批量更新/删除时,用重写分区或重建表代替逐行变更
如果是海量批量更新,直接重写更划算 CREATE TABLE new_t AS SELECT ... FROM old_t WHERE ... 或者 INSERT OVERWRITE 受影响分区
(部分删除场景)不用:DELETE FROM t WHERE dt < '2026-01-01';
使用:ALTER TABLE t DROP PARTITION (...)
如果只涉及部分分区或者桶,则compact指定对应分区和桶参数,减少compact数据量:Compaction and Cleanup | Apache Paimon
bucket太少会导致compact并行度受限,合理增加bucket数
更合理的是让 bucket 数和写入/compact 并行度匹配。例如:
'bucket' = '64',
'bucket-key' = 'id',
'sink.parallelism' = '64'
Paimon 官方建议 fixed bucket 下 sink.parallelism <= bucket,最好接近或相等
增大写buffer,减少小文件
'write-buffer-size' = '256 mb'
'write-buffer-spillable' = 'true'
'target-file-size' = '256 mb'