Flink恰好一次 - 接收器处的检查点和屏障确认

时间:2018-05-31 01:53:27

标签: apache-flink flink-streaming checkpointing

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

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

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

我无法升级到Flink 1.4的TwoPhaseCommitSink

我很怀疑

  1. 在调用函数开始时或调用完成时,接收器在哪个时间点确认检查点屏障?是否意味着在确认障碍之前等待持久化(保存在MongoDB中)响应?
  2. 如果通过异步线程提交检查点,Flink如何在作业失败时保证一次?如果数据由接收器保存到MongoDB但是检查点未提交怎么办?我认为这将在重启时结束重复数据。
  3. 当我从Flink仪表板取消作业时,Flink是否会完成异步检查点线程以完成或者是一次难以杀死的-9呼叫?

1 个答案:

答案 0 :(得分:3)

首先,如果源和接收器支持这一点,Flink只能保证端到端的一次性一致性。如果您正在使用Flink的Kafka使用者,Flink可以保证应用程序的内部状态完全一致。为了实现完全端到端的完全一致性,接收器也需要适当支持。如果MongoDB接收器工作正常,您应该检查它的实现。

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

blog post更详细地讨论了端到端的一次性处理和接收器运算符的要求。