Flink是如何保证从任务失败的状态中恢复后的结果的准确性呢?

任务失败

流任务中的运算符状态是很宝贵的,也需要抵御任务失败带来的问题。如果在任务失败的情况下,状态丢失的话,在任务恢复以后计算的结果将是不正确的。流任务会连续不断的运行很长时间,而状态可能已经收集了几天甚至几个月。在失败的情况下,重新处理所有的输入并重新生成一个丢失的状态,将会很浪费时间,开销也很大。

在之前的文章中,我们们看到如何将流的编程建模成数据流模型。在执行之前,流程序将会被翻译成物理层数据流图,物理层数据流图由连接的并行任务组成,而一个并行任务运行一些运算符逻辑,消费输入流数据,并为其他任务产生输出流数据。真实场景下,可能有数百个这样的任务并行运行在很多的物理机器上。在长时间的运行中,流任务中的任意一个任务在任意时间点都有可能失败。我们如何保证任务的失败能被正确的处理,以使任务能继续的运行下去呢?事实上,我们不仅希望流处理器能在任务失败的情况下继续处理数据,并且还能保证计算结果的正确性以及运算符状态的安全。那是怎么保证的呢?

啥是任务失败?

对于流中的每一个事件,一个处理任务分为以下步骤:
(1)接收事件,并将事件存储在本地的缓存中;
(2)可能会更新内部状态;
(3)产生输出记录。
这些步骤都能失败,而系统必须对于在失败的场景下如何处理有清晰的定义。如果任务在第一步就失败了,事件会丢失吗?如果当更新内部状态的时候任务失败,那么内部状态会在任务恢复以后更新吗?在以上这些场景中,输出是确定性的吗?

在批处理场景下ÿ

猜你喜欢

转载自blog.csdn.net/MissWYAN/article/details/108891414