【问题标题】:Flink window operator checkpointingFlink 窗口操作符检查点
【发布时间】:2019-05-25 10:05:52
【问题描述】:

想知道flink是怎么做window operator的checkpoint的。恢复时如何保证恰好是一次?例如,保存当前窗口中的元组,保存当前窗口处理的进度。想知道window operator的checkpoint和recovery的详细过程。

【问题讨论】:

标签: apache-flink


【解决方案1】:

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

因此,这些检查点捕获分布式管道的整个状态,将偏移量记录到输入队列中,以及整个作业图的状态,这些状态是由于在该点之前摄取数据而产生的。当发生故障时,源被倒带,状态被恢复,并且处理被恢复。

鉴于在恢复过程中源会被倒带和重放,“exactly once”意味着 Flink 管理的状态只受到一次影响,而不是流元素只被处理一次。

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

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

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

【讨论】:

  • 1.您的意思是该窗口会将窗口的内容保存为状态保存并记录当前正在处理的元组。故障恢复时,加载状态恢复窗口内容,恢复故障前正在处理的元组的状态。
  • 2.例如,我有一个内容为 [1, 2, 3, 4, 5, 6] 的窗口 A。我正在使用ProcessWindowFunctions。当窗口 A 在3 收到屏障并完成检查点时,则此检查点保存内容 {1, 2, 3, 4, 5, 6} 和处理后的元组3。但是,处理5 时发生故障。然后,在恢复时,窗口 A 会重新加载 [1, 2, 3, 4, 5, 6] 并从3 重新开始处理。我说的对吗?
  • 不,这不正确。我已经更新了我的答案;希望现在更清楚了。
  • 如果我在窗口后使用ReduceFunction,那么flink会自动保存ReducingState,而不是像ProcessWindowFunction那样保存窗口的所有元组?恢复的时候,ProcessWindowFunction的Window加载所有的元组,而ReduceFunction的Window只加载ReducingState。我说的对吗?
猜你喜欢
  • 2022-11-16
  • 2022-12-17
  • 2019-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-18
  • 1970-01-01
  • 2020-09-16
相关资源
最近更新 更多