首页 > 解决方案 > Flink 检查点/保存点类变量吗?

问题描述

如果 Flink 应用程序在失败后启动备份或更新,是否保留不明确属于 KeyedState 或 OperatorState 的类变量?

例如,Flink 文档中描述的 BoundedOutOfOrdernessGenerator 有一个 currentMaxTimestamp 变量。如果更新了 Flink 应用程序,currentMaxTimestamp 中的值会丢失,还是会写入应用程序更新之前创建的保存点?

这样做的真正原因是我想实现一个自定义水印生成器(类似于此),如果源空闲时间过长,它会在生成水印时切换到处理时间。但是,我希望根据类变量重置为其原始默认值(例如我上面提供的链接的示例中的 Long.MIN_VALUE),检测到应用程序在更新或失败后重新上线。这样,我可以确保水印生成器不会将耗时五分钟的应用程序更新误认为是空闲五分钟的源。

此外,如果应用程序更新,Flink 是否会重新启动每个水印生成器操作符,即使水印生成器没有进行任何更改?

标签: apache-flinkflink-streaming

解决方案


只有由 Flink 显式管理的状态才会被持久化——所以是的,currentMaxTimestamp从快照恢复时 in 的值会丢失。当前的水印也不包含在快照中。

我认为你可以做的——虽然我没有尝试过——是让你的水印生成器实现CheckpointedFunction接口。然后,您可以实现这两种方法:

public void snapshotState(FunctionSnapshotContext context)
public void initializeState(FunctionInitializationContext context)

initializeState您有权访问的方法中context.isRestored(),您可以知道是否从快照重新启动。


推荐阅读