在 Flink 中,业务逻辑变更导致拓扑结构改变(增加或删除算子)是生产环境中的常见需求。为了保证重启后原本的 State 数据能够正确映射并恢复,核心在于 算子标识(Operator UID) 的管理以及 启动参数 的配合。 以下是完整的解决方案和实操指南: 1. 核心前提:显式指定算子 UID(The Golden Rule) Flink 是通过算子的 UID 来将 Savepoint/Checkpoint 中的状态数据映射到新拓扑中的算子上的。 如果没有显式设置 UID:Flink 会根据算子在拓扑中的位置自动生成哈希值作为 UID。一旦你增加或删除算子,后续所有算子的位置发生变化,自动生成的 UID 随之改变,导致状态完全无法恢复。 正确做法:在开发时,必须为所有带有状态的算子显式调用 。 --- 2. 场景一:增加算子 (Add Operator) 假设你在原有的拓扑中插入了一个新的算子。 操作步骤: 1. 在代码中添加新算子,并 务必为其分配一个全新的、全局唯一的 。 2. 触发一次旧作业的 Savepoint 并停止作业。 3. 从该 Savepoint 启动新作业...