了解flink保存点和检查点

bq9c1y66  于 2021-06-21  发布在  Flink
关注(0)|答案(1)|浏览(624)

考虑到apache flink流应用程序的管道如下:

Kafka-Source -> flatMap 1 -> flatMap 2 -> flatMap 3 -> Kafka-Sink

每个 flatMap 函数是非状态运算符(例如 .flatMap a的功能 Datastream ).
检查点/保存点如何工作,以防传入的消息在 flatMap 3 ? 从开始重新启动后是否重新处理消息 flatMap 1 还是会跳到 flatMap 3 ?
我有点困惑,因为文档似乎提到应用程序状态是我可以在有状态运算符中使用的,但是我的应用程序中没有有状态运算符。是否保存并恢复了“处理进度”,或者在失败/重新启动后是否重新处理整个管道?
对于我之前的问题,失败(->flink从检查点恢复)和使用保存点手动重启之间有什么区别?
我试着用 EXACTLY_ONCE 和rocksdb后端),通过放置 Thread.sleep()flatMap 3 然后用保存点取消作业。然而,这导致了 flink 命令行工具挂起,直到 sleep 结束了,即使在那时 flatMap 3 在作业被取消之前被执行甚至发送到Flume。所以我似乎无法手动强迫这种情况来分析Flink的行为。
如果“处理进度”没有像我上面描述的那样被检查点/保存点保存/覆盖,我如何确保到达我的管道的每条消息在重启/失败情况下都不会重新处理任何给定的操作符(flatmap 1/2/3)?

6jjcrrmo

6jjcrrmo1#

当执行检查点时,每个任务(操作符的并行示例)都会检查其状态。在您的示例中,三个flatmap操作符是无状态的,因此没有要检查的状态。kafka源是有状态的,检查所有分区的读取偏移量。
如果出现故障,则恢复作业并加载所有任务的状态,这意味着在源操作符的情况下,将重置读取偏移量。因此,应用程序将重新处理自上一个检查点以来的所有事件。
为了只实现一次端到端,您需要一个特殊的sink连接器,它提供事务支持(例如,对于kafka)或支持幂等写。

相关问题