我想知道flink如何执行窗口运算符的检查点。如何确保恢复时恰好一次?例如,将元组保存在当前窗口中,并保存当前窗口处理的进度。我想知道窗口操作员检查点和恢复的详细过程。
答案 0 :(得分:2)
所有Flink的有状态运算符都参与相同的检查点机制。当检查点协调员(作业管理器的一部分)指示这样做时,任务管理器在每个源操作员的每个并行实例中启动一个检查点。源检查点的偏移量并将检查点障碍插入流中。这会将流分为检查点之前和之后的部分。障碍流经图形,并且每个有状态操作员在处理完流直至检查点障碍之后,都会检查其状态。详细信息在@bupt_ljy共享的链接上进行了描述。
因此,这些检查点捕获了分布式管道的整个状态,将偏移量记录到输入队列中,并将整个作业图中的状态记录为已提取数据到该点为止。发生故障时,将重新倒转源,恢复状态,并恢复处理。
鉴于在恢复过程中将源倒回并重播,“恰好一次”表示Flink管理的状态只受到一次影响,而不是流元素仅受到一次处理。
在这方面,关于Windows没有什么特别的。根据所应用的窗口函数的类型,窗口的内容保存在托管的ListState,ReducingState,AggregatingState或FoldingState的元素中。当流元素到达并分配给窗口时,它们将被附加,缩小,聚合或折叠为该状态。窗口API的其他组件(包括触发器和ProcessWindowFunctions)也可以具有检查点状态。例如,CountTrigger
使用ReducingState跟踪已分配给窗口的元素数,并在将每个元素添加到窗口时在计数中增加一个。
在窗口函数是ProcessWindowFunction的情况下,分配给窗口的所有元素都以Flink状态保存,并在触发窗口时以Iterable形式传递给ProcessWindowFunction。该函数遍历内容并产生结果。 ProcessWindowFunction的内部状态未检查点;如果作业在执行ProcessWindowFunction期间失败,则作业将从最近完成的检查点恢复。这将涉及倒退到窗口接收到触发窗口触发的事件之前的时间(该事件不能包含在检查点中,因为紧随其后的检查点障碍尚未生效)。窗口迟早将再次到达触发它的位置,并且将再次调用ProcessWindowFunction -具有与第一次收到的窗口内容相同的窗口-希望这次不会失败。 (请注意,我忽略了处理时间窗口的情况,这种情况无法确定。)
当ProcessWindowFunction使用托管/检查点状态时,它用于记住两次触发之间的情况,而不是一次触发。例如,一个允许延迟事件的窗口可能想要存储先前报告的结果,然后为每个延迟事件发布更新。