Apache flink 如何知道作业是否从保存点还原?

Apache flink 如何知道作业是否从保存点还原?,apache-flink,Apache Flink,在ApacheFlink中定义和执行流处理器的作业图之前,我想运行一些初始化代码,例如,用于创建Kafka主题,我将其用作作业图中的接收器。 但是,当从保存点还原流处理器时(例如,在流处理器更新期间),不应运行此初始化代码。有没有办法通过编程检查作业是否从保存点启动?从保存点重新启动作业时,必须指定保存点目录的路径 我们的做法如下: $ bin/flink run -s :savepointPath [:runArgs] 如果我正确理解了您的问题,您所要做的就是验证是否指定了-fromSave

在ApacheFlink中定义和执行流处理器的作业图之前,我想运行一些初始化代码,例如,用于创建Kafka主题,我将其用作作业图中的接收器。
但是,当从保存点还原流处理器时(例如,在流处理器更新期间),不应运行此初始化代码。有没有办法通过编程检查作业是否从保存点启动?

从保存点重新启动作业时,必须指定保存点目录的路径

我们的做法如下:

$ bin/flink run -s :savepointPath [:runArgs]
如果我正确理解了您的问题,您所要做的就是验证是否指定了-fromSavepoint或-salias


可以实现能够感知快照和恢复的Flink函数。您可以通过实现CheckpointedFunction接口来实现这一点。然后,在调用initializeStateFunctionInitializationContext上下文时,可以检查context.isRestored以确定作业是否从快照(即从检查点或保存点)重新启动


您可能采取的另一种方法是检查主题是否已经存在,如果不存在,则继续创建它们,而不考虑作业是如何启动的。

在我看来,您真的应该应用相同的逻辑,而不是在作业失败后从检查点重新启动时进行特殊初始化,这种方法无法捕捉到。嗨,大卫。我使用了这个示例,但使用了ProcessFunction而不是SinkFunction来验证是否通过依赖context.isRestored方法恢复了作业。当我的工作试图恢复时,我似乎从来没有实现过这种方法。它也不适用于RichMapFunction