为什么在使用FsStateBackend重新启动flink崩溃后flink 1.10.1无法加载存储的状态

时间:2020-07-09 14:00:03

标签: java apache-flink flink-streaming flink-cep

我将Flink 1.10.1和FsStateBackend用作检查点的状态后端。我有一些有状态操作,这些操作在应用程序运行期间(以.jar应用程序而不是作为群集运行)可以按预期运行,但是如果应用程序由于某种原因停止(或崩溃),则应使用检查点没有被加载,函数没有任何先前的引用,那么我需要从数据库中加载信息并将其另存为状态,以再次使用这些先前的状态。必须有一种使用检查点和FsStateBackend来执行此操作的方法,而不必从数据库中读取所有信息,只需从已存储的检查点重新加载此状态即可。这可能吗?

这是一些代码: 我的检查点配置

$mail->msgHTML(file_get_contents('/emails/emailcontent.html'), __DIR__);

这是我要避免的示例:

final StreamExecutionEnvironment env = StreamExecutionEnvironment.createLocalEnvironment(8, GetConfiguration.getConfig());
final StateBackend stateBackend = new FsStateBackend(new Path("/some/path/checkpoints").toUri(), true);
            env.getCheckpointConfig().enableExternalizedCheckpoints(CheckpointConfig.ExternalizedCheckpointCleanup.RETAIN_ON_CANCELLATION);
            env.getCheckpointConfig().setMinPauseBetweenCheckpoints(5000);
            env.getCheckpointConfig().setMaxConcurrentCheckpoints(1);

env.enableCheckpointing(30000, CheckpointingMode.EXACTLY_ONCE);
 env.getCheckpointConfig().setCheckpointTimeout(60000);
            env.getCheckpointConfig().setTolerableCheckpointFailureNumber(10);
            env.getCheckpointConfig().setPreferCheckpointForRecovery(true);
            env.setRestartStrategy(RestartStrategies.noRestart());
            env.setStateBackend(stateBackend);

希望我能为您解释自己,以了解我需要做什么。 亲切的问候! 预先感谢。

1 个答案:

答案 0 :(得分:0)

要在重新启动作业时加载检查点的状态,必须明确安排这种情况的发生,否则将在不加载检查点的情况下重新运行该作业。

有关详细信息,请参见Restore from a savepointResuming from a retained checkpoint,但是要点是:

bin/flink run -s :checkpointPath [:runArgs]

我的猜测是这还没有完成。

关于如何配置Flink群集以进行自动恢复的最佳实践,这取决于您使用的内容(纱线,Mesos,Kubernetes等)。