我正在使用flink1.9和restapi/jobs/:jobid/savepoints来触发保存点并取消 job(优雅地停止 job以便稍后从保存点运行)。
我在源函数中使用了两阶段提交,因此我的源代码实现了CheckpointedFunction和CheckpointListener接口。在snapshotState()方法调用上,我快照内部状态;在notifyCheckpointComplete()上,我将 checkpoints状态发送给第三方系统。
从源代码中可以看出,CheckpointCoordinator中只有snapshotState()部分是同步的-
// send the messages to the tasks that trigger their checkpoint
for (Execution execution: executions) {
if (props.isSynchronous()) {
execution.triggerSynchronousSavepoint(checkpointID, timestamp, checkpointOptions, advanceToEndOfTime);
} else {
execution.triggerCheckpoint(checkpointID, timestamp, checkpointOptions);
}
}
checkpoints确认和完成通知在AsyncCheckpointRunnable中是异步的。
也就是说,当cancel job设置为true的保存点被触发时,在拍摄快照之后,一些任务管理器会在 job取消之前保持接收完成通知并执行notifyCheckpointComplete(),而有些则不会。
问题是,是否有一种方法可以使用保存点取消 job,从而确保在取消 job之前,所有任务管理器都可以调用notifyCheckpointComplete(),或者目前没有方法实现这一点?