Apache flink 弗林克窗口操作员检查点

Apache flink 弗林克窗口操作员检查点,apache-flink,Apache Flink,我想知道弗林克是如何完成窗口操作员的检查点的。如何确保在恢复时只执行一次?例如,在当前窗口中保存元组并保存当前窗口处理的进度。我想知道窗口操作符的检查点和恢复的详细过程。Flink的所有有状态操作符都参与相同的检查点机制。当检查点协调员(作业管理器的一部分)指示这样做时,任务管理器在每个源操作符的每个并行实例中启动检查点。源检查其偏移量并在流中插入检查点屏障。这将流划分为检查点前后的部分。屏障在图中流动,每个有状态的操作员在处理流向检查点屏障的流时检查其状态。有关详细信息,请参见@bupt_lj

我想知道弗林克是如何完成窗口操作员的检查点的。如何确保在恢复时只执行一次?例如,在当前窗口中保存元组并保存当前窗口处理的进度。我想知道窗口操作符的检查点和恢复的详细过程。

Flink的所有有状态操作符都参与相同的检查点机制。当检查点协调员(作业管理器的一部分)指示这样做时,任务管理器在每个源操作符的每个并行实例中启动检查点。源检查其偏移量并在流中插入检查点屏障。这将流划分为检查点前后的部分。屏障在图中流动,每个有状态的操作员在处理流向检查点屏障的流时检查其状态。有关详细信息,请参见@bupt_ljy共享的链接

因此,这些检查点捕获分布式管道的整个状态,将偏移量记录到输入队列中,以及整个作业图中由于接收到该点的数据而导致的状态。当发生故障时,源将被重绕,状态将恢复,处理将恢复

考虑到在恢复过程中源会被重绕和重放,“精确一次”意味着Flink管理的状态只会受到一次影响,而不是流元素只会被处理一次

windows在这方面没有什么特别之处。根据应用的窗口函数的类型,窗口的内容保存在托管ListState、ReductionState、AggregatingState或FoldingState的元素中。当流元素到达并被分配到窗口时,它们被追加、缩减、聚合或折叠到该状态。窗口API的其他组件,包括触发器和ProcessWindowFunctions,也可以具有检查点状态。例如,
CountTrigger
使用reduceingstate跟踪分配给窗口的元素数量,在每个元素添加到窗口时向计数中添加一个元素

在窗口函数为ProcessWindowFunction的情况下,分配给窗口的所有元素都以Flink状态保存,并在触发窗口时以Iterable形式传递给ProcessWindowFunction。该函数迭代内容并生成结果。ProcessWindowFunction的内部状态没有检查点;如果作业在ProcessWindowFunction执行期间失败,作业将从最近完成的检查点恢复。这将涉及回放到窗口接收到触发窗口触发的事件之前的时间(该事件不能包含在检查点中,因为它后面的检查点屏障可能尚未生效)。窗口迟早会再次到达触发点,ProcessWindowFunction将再次被调用——与第一次收到的窗口内容相同——希望这次不会失败。(请注意,我忽略了处理时间窗口的情况,它的行为不是确定性的。)


当ProcessWindowFunction使用托管/检查点状态时,它用于在触发之间(而不是在一次触发中)记住事情。例如,允许延迟事件的窗口可能希望存储以前报告的结果,然后为每个延迟事件发布更新。

Flink的所有有状态运算符都参与相同的检查点机制。当检查点协调员(作业管理器的一部分)指示这样做时,任务管理器在每个源操作符的每个并行实例中启动检查点。源检查其偏移量并在流中插入检查点屏障。这将流划分为检查点前后的部分。屏障在图中流动,每个有状态的操作员在处理流向检查点屏障的流时检查其状态。有关详细信息,请参见@bupt_ljy共享的链接

因此,这些检查点捕获分布式管道的整个状态,将偏移量记录到输入队列中,以及整个作业图中由于接收到该点的数据而导致的状态。当发生故障时,源将被重绕,状态将恢复,处理将恢复

考虑到在恢复过程中源会被重绕和重放,“精确一次”意味着Flink管理的状态只会受到一次影响,而不是流元素只会被处理一次

windows在这方面没有什么特别之处。根据应用的窗口函数的类型,窗口的内容保存在托管ListState、ReductionState、AggregatingState或FoldingState的元素中。当流元素到达并被分配到窗口时,它们被追加、缩减、聚合或折叠到该状态。窗口API的其他组件,包括触发器和ProcessWindowFunctions,也可以具有检查点状态。例如,
CountTrigger
使用reduceingstate跟踪分配给窗口的元素数量,在每个元素添加到窗口时向计数中添加一个元素

在窗口函数为ProcessWindowFunction的情况下,分配给窗口的所有元素都以Flink状态保存,并在触发窗口时以Iterable形式传递给ProcessWindowFunction。该函数迭代内容并生成结果。ProcessWindowFunction的内部状态没有检查点;如果作业在ProcessWindowFunction执行期间失败,作业将从最近完成的检查点恢复。这将涉及回放到windo之前的时间