1

我有一个带有接收器的 Flink 作业,它将数据写入 MongoDB。接收器是RichSinkFunction.

启用外部检查点。间隔为 5000 磨,方案为 EXACTLY_ONCE。

  • Flink 1.3 版,
  • Kafka(源主题)0.9.0

我无法升级到TwoPhaseCommitSinkFlink 1.4。

我有几个疑问

  1. 接收器在哪个时间点确认检查点屏障,在调用函数开始时还是在调用完成时?意味着它在确认障碍之前等待持久(保存在 MongoDB 中)响应?
  2. 如果提交 checkpoint 是由异步线程完成的,那么 Flink 怎么能保证在作业失败的情况下只执行一次呢?如果接收器将数据保存到 MongoDB 但未提交检查点怎么办?我认为这最终会在重新启动时出现重复数据。
  3. 当我从 Flink 仪表板取消作业时,Flink 会完成异步检查点线程以完成还是硬 kill -9 调用?
4

1 回答 1

3

首先,Flink 只有在 source 和 sinks 支持的情况下才能保证端到端的exactly-once 一致性。如果你使用的是 Flink 的 Kafka 消费者,Flink 可以保证应用程序的内部状态是完全一致的。为了实现端到端的完全一次一致性,接收器也需要适当地支持这一点。如果 MongoDB 接收器工作正常,您应该检查它的实现。

检查点屏障通过数据传输通道发送常规消息,即检查点屏障n将流分成进入检查点n和的记录n + 1。接收器操作员将处理两个invoke()调用之间的屏障并触发状态后端执行检查点。然后由状态后端决定是否以及如何异步执行检查点。一旦触发检查点的调用返回,接收器可以继续处理。一旦状态后端通知接收器操作员,它将向 JobManager 报告它已完成对其状态的检查点。当所有操作员成功报告他们完成了他们的检查点时,一个整体检查点就完成了。

这篇文更详细地讨论了端到端的一次性处理以及对接收器操作员的要求。

于 2018-05-31T08:05:35.877 回答