我正在使用Apache Flink 1.9和标准检查点/保存点机制来FS。
我的问题是:如果作业的代码被更改,从保存点恢复作业的正确方法是什么? 例如,重构后我重命名了一些类,之后我无法从旧检查点恢复。
我丢失了我的数据,想问 - 在这种情况下我能做什么?
所有运算符都有 uid 和名称
简而言之:这取决于。
至于更详细的解释,如果您只是重新排序和重命名类,显然只要 UID 没有更改,这通常不应该是一个问题。至于重构,它实际上可能会影响状态的存储方式,从而可能阻止恢复状态。在这种情况下,您可以使用参数--allowNonRestoredState
,它应该允许从保存点恢复可用状态并启动干净的状态。请记住,这可能无法还原所有状态。通常,您不应该在运算符运行时真正重构它们,因为它可以有效地防止从保存点还原。
值得注意的是,如果您使用的是 SQL,则可能无法从保存点还原,请参阅 FLINK-6966 问题。
我假设您正在处理保存点而不是外部化的检查点,否则很少需要注意的事情,尤其是在更改并行性时。
似乎您的状态不能被视为POJO(POJO:遵循某种类似豆类模式的类(。当用户定义的数据类型无法识别为 POJO 类型时,必须将其处理为 GenericType 并使用 Kryo 进行序列化。 目前,在 Flink 中,仅支持 POJO 和 Avro 类型的模式演化。因此,如果您关心状态的架构演变,目前建议始终使用 Pojo 或 Avro 作为状态数据类型。
一些文档仅供参考: https://ci.apache.org/projects/flink/flink-docs-stable/dev/types_serialization.html https://ci.apache.org/projects/flink/flink-docs-stable/dev/stream/state/schema_evolution.html