代码更改后使Flink作业从状态还原

时间:2019-11-25 18:13:41

标签: apache-flink

我正在使用Apache Flink 1.9和FS的标准检查点/保存点机制。

我的问题是:如果更改了作业的代码,从保存点还原作业的正确方法是什么? 例如,在重构之后,我重命名了几个类,在那之后,我无法从旧的检查点恢复。

我丢失了数据,想问-在这种情况下我能做什么?

所有运算符都有uid和名称

2 个答案:

答案 0 :(得分:1)

简而言之:这取决于。

至于更详尽的解释,只要您对类进行了重新排序和重命名(通常只要UID不变),通常就不成问题。至于重构,它实际上可能影响状态的存储方式,从而可能阻止恢复状态。在这种情况下,您可以使用参数--allowNonRestoredState,该参数应允许从保存点恢复可用状态并启动干净状态。 请记住,这可能无法还原所有状态。通常,操作员一旦运行就不应真正对其进行重构,因为它可以有效地防止从保存点还原。

值得注意的是,如果您使用的是SQL,则可能无法从保存点还原,请参阅FLINK-6966问题。

我假设您处理的是保存点而不是外部检查点,否则要记住的事情很少,尤其是在更改并行性时。

答案 1 :(得分:1)

似乎不能将您的状态视为POJO(POJO:遵循某种类似于bean的模式的类)。如果无法将用户定义的数据类型识别为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