/*+ OPTIONS(
'scan.mode' = 'latest-full',
'consumer-id' = '${consumer_prefix}_brand_commodity',
'consumer.mode' = 'exactly-once',
'consumer.expiration-time' = '7 d',
'consumer.ignore-progress' = '${ignore_progress}'
) */
- 带 Savepoint/Checkpoint 重启 :Flink 直接从状态里记录的 snapshot 精确续跑,同时
consumer-id保住停机期间(7 天内)的 Paimon 快照不被过期清理; - 改 SQL 丢弃状态冷启动 :自动按
latest-full重新把维表/近 60 天订单加载进 JOIN 状态后再转增量,防止 JOIN 状态为空; - 若后续某次迭代希望不带状态也强制从上次 consumer 位点硬续 :直接在变量配置中把
ignore_progress改为false即可,无需改动 SQL。
官方文档

Set consumer.ignore-progress = true when the consumer should protect the reader's required history but a fresh job should choose its startup position from scan options instead of the stored consumer position. For example, follow only new changes on a fresh start
翻译为中文:
当消费者需要保护读取器所需的历史数据,但一个新的作业应当根据扫描选项(scan options)来选择启动位置、而不是使用已存储的消费者位置(consumer position)时,将 consumer.ignore-progress 设置为 true。例如,在全新启动时只跟随新的变更。
consumer.ignore-progress =true
适用场景:新作业不想继承旧 consumer ID 下保存的消费进度,希望按扫描配置重新决定从哪里开始读。
作用:忽略已存储的 consumer progress / consumer position,不从上一次提交的消费位置继续读取
启动位置来源 :改为由 scan 选项决定,例如 scan.mode、scan.startup.mode 等启动模式配置。
参数和chk优先级
第一优先:Flink Checkpoint / Savepoint(状态恢复)
如果作业是从 Flink 状态恢复的,那么 scan.restore(nextSnapshotId) 会直接让扫描从状态中恢复的位置继续,待处理的 Split 和记录也会一并恢复。此时,Flink 状态拥有最高优先级 ,Consumer 位置和 scan.mode 都不会被使用。
第二优先:已存在的 Consumer 位置
如果作业不是 从 Flink 状态恢复,但配置了 consumer-id 且该 Consumer 已经存在 ,那么默认情况下,Consumer 记录的下一个快照位置会优先于 scan.mode 启动选项 ,作业会从该位置开始进行增量读取。这是 consumer-id 实现"Resume from breakpoint"(无需状态恢复即可续读)的核心机制。
Consumer 位置的例外:启用 consumer.ignore-progress = true
这是你问题的关键。当设置 'consumer.ignore-progress' = 'true' 时,第二优先的 Consumer 位置会被忽略 。作业会跳过已存储的 Consumer 进度,转而回退到第三优先 ,即根据 scan.mode 等启动选项来重新选择启动位置。
第三优先:scan.mode 启动选项
如果 Flink 状态不存在,Consumer 也不存在(或因为 ignore-progress 被忽略),系统最终会使用你配置的 scan.mode(如 latest-full、from-timestamp 等)来决定扫描的起点
