首页 文章

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

提问于
浏览
1

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

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

  • Flink 1.3版,

  • Kafka(来源主题)0.9.0

我无法升级到Flink 1.4的 TwoPhaseCommitSink .

我几乎没有怀疑

  • 在调用函数开始时或调用完成时,接收器在哪个时间点确认检查点屏障?意味着它在确认障碍之前等待持久化(保存在MongoDB中)响应?

  • 如果通过异步线程提交检查点,Flink如何在作业失败的情况下保证一次?如果数据由接收器保存到MongoDB但是检查点未提交怎么办?我认为这将在重启时结束重复数据 .

  • 当我从Flink仪表板取消作业时,Flink是否会完成异步检查点线程以完成或者是一次难以杀死的-9呼叫?

1 回答

  • 3

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

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

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

相关问题