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