我有一个带有接收器的 Flink 作业,该接收器正在将数据写入 MongoDB。接收器是RichSinkFunction
的实现。
已启用外部化检查点。区间为5000磨坊,方案为EXACTLY_ONCE。
- Flink 版本 1.3, 卡
- 夫卡(源主题(0.9.0
我无法升级到 Flink 1.4 的TwoPhaseCommitSink
。
我几乎没有疑问
- 接收器在哪个时间点确认检查点屏障,在调用函数开始时或调用完成时?意味着它在确认障碍之前等待持久(保存在 MongoDB 中(响应?
- 如果提交检查点是由异步线程完成的,Flink 如何保证在作业失败的情况下恰好一次?如果数据由接收器保存到MongoDB但检查点未提交怎么办?我认为这最终会在重新启动时重复数据。
- 当我从 Flink 仪表板取消作业时,Flink 会完成异步检查点线程以完成还是硬终止 -9 调用?
首先,Flink 只有在源和接收器支持的情况下才能保证端到端恰好一次的一致性。如果你使用的是 Flink 的 Kafka 消费者,Flink 可以保证应用的内部状态是恰好一次一致的。若要实现完全端到端恰好一次的一致性,接收器也需要适当地支持这一点。您应该检查 MongoDB 接收器的实现是否正常工作。
检查点屏障是通过数据传输通道发送常规消息,即检查点的屏障n
将流分成进入检查点n
和n + 1
的记录。接收器操作员将处理两个invoke()
调用之间的屏障,并触发状态后端以执行检查点。然后由状态后端决定它是否可以以及如何异步执行检查点。触发检查点的调用返回后,接收器可以继续处理。接收器操作员将在状态后端通知后向 JobManager 报告它已完成检查点其状态。当所有操作员都成功报告他们已完成检查点时,整个检查点完成。
这篇博文更详细地讨论了端到端恰好一次处理以及对接收器操作员的要求。