这个问题与这里提出的问题基本相似:Apache Flink容错。i、 e.如果作业在两个检查点之间重新启动,会发生什么情况?它会重新处理在最后一个检查点之后已经处理过的记录吗?
例如,我有两份工作,工作1和工作2。Job1使用来自Kafka的记录,对其进行处理,然后再次将其生成到第二个Kafka主题。Job2使用第二个主题并处理记录(在我的例子中,它使用AerospikeClient更新aerospike中的值)。
现在,从Apache Flink容错问题的答案来看,我可以相信,如果job1重新启动,它将不会在接收器中生成重复的记录。我使用的是FlinkKafkaProducer011,它扩展了TwoPhaseCommitSinkFunction(https://flink.apache.org/features/2018/03/01/end-to-end-exactly-once-apache-flink.html)。请解释它将如何防止重新处理(即重复制作Kafka的记录)。
据Flink doc称,Flink从最后一个成功的检查点重新启动作业。因此,如果job2在完成检查点之前重启,它将从最后一个检查点重启,并且在最后一个检查点之后已经处理的记录将被重新处理(即aerospike中的多次更新)。我说得对吗?还是说Flink还有别的地方(
在这种情况下,Flink确实会重新处理一些事件。在恢复期间,输入分区的偏移量将重置为最近检查点中的偏移量,并且将重新摄取在该检查点之后读取的事件。
但是,Flink KafkaProducer
使用在检查点完成时提交的Kafka事务。当作业失败时,它自上次检查点以来产生的任何输出都受到从未提交的事务的保护。只要该作业的消费者配置为使用read_committed
作为他们的isolation.level
,他们就不会看到任何重复。
有关更多详细信息,请参阅在Flink Jobs中使用Kafka源/汇的最佳实践。
有人能给这点启示吗?
好吧,我想我的问题描述了自己,不管怎样,这里是代码
我正在使用Apache Flink RabbitMQ堆栈。我知道有机会手动触发保存点并从中还原作业,但问题是Flink会在成功的检查点之后确认消息,如果要使保存点和还原状态为,则会丢失上次成功的保存点和上次成功的检查点之间的所有数据。有没有办法从检查点恢复作业?这将解决在不可重放数据源(如rabbitmq)的情况下丢失数据的问题。顺便说一句,如果我们有检查点及其所有开销,为什么不让用户使用它们呢?
我正在检查Flink Sql Table与kafka连接器是否可以在EXACTLY_ONCE模式下执行,我的方法是创建一个表,设置合理的检查点间隔,并在event_time字段上使用简单的翻滚函数,最后重新启动我的程序。 以下是我的详细进度: 1:创建一个Kafka表 2:启动我的 Flink 作业,如下所示配置 3:执行我的sql 如我们所见,翻转窗口间隔为5分钟,检查点间隔为30秒,每个翻转窗
如果Cadence集群关闭而工作流应该已经启动,CronWorkflow的行为是什么?当集群回来时,我们会期望工作流仍然启动吗?
docker合成文件: