Apache flink Flink仅一次-检查点和接收点的屏障确认

Apache flink Flink仅一次-检查点和接收点的屏障确认,apache-flink,flink-streaming,checkpointing,Apache Flink,Flink Streaming,Checkpointing,我有一个Flink的工作,负责将数据写入MongoDB的接收器。接收器是RichSinkFunction的一个实现 已启用外部化检查点。间隔为5000米,方案为一次 Flink版本1.3 卡夫卡(源主题)0.9.0 我无法升级到Flink 1.4的TwophaseCommissink 我没有什么疑问 在调用函数开始时或调用完成时,接收器在哪个时间点确认检查点屏障?表示它在确认屏障之前等待持久化(保存在MongoDB中)响应 如果提交检查点是由异步线程完成的,Flink如何保证在作业失败的情况

我有一个Flink的工作,负责将数据写入MongoDB的接收器。接收器是
RichSinkFunction
的一个实现

已启用外部化检查点。间隔为5000米,方案为一次

  • Flink版本1.3
  • 卡夫卡(源主题)0.9.0
我无法升级到Flink 1.4的
TwophaseCommissink

我没有什么疑问

  • 在调用函数开始时或调用完成时,接收器在哪个时间点确认检查点屏障?表示它在确认屏障之前等待持久化(保存在MongoDB中)响应
  • 如果提交检查点是由异步线程完成的,Flink如何保证在作业失败的情况下只提交一次检查点?如果接收器将数据保存到MongoDB,但检查点未提交,该怎么办?我认为重新启动时会出现重复数据
  • 当我从Flink仪表板取消一个作业时,Flink会完成要完成的异步检查点线程吗?还是这是一个硬kill-9调用

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

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


    这将更详细地讨论端到端的一次性处理和接收器操作员的要求。

    因此,一旦我确定我的数据在Mongo中成功持久化,是否可以在接收器中强制执行检查点。否,检查点由JobManager触发。因此,这是另一种方式,涉及面更广。检查点完成后,您只能向外部系统提交数据(实现
    CheckpointListerner
    接口)。此外,您需要确保在出现故障时可以重复事务。此主题太复杂,无法对堆栈溢出进行评论。查看博客文章,并可能将
    TwoPhaseCommitink
    备份到您的版本。