如何理解Flink的exactly-once和at-least-once语义

问题描述 投票:0回答:1

我是 Flink 的新手,目前正在探索框架中的容错。我知道 Flink 提供了 Exactly-Once 和 At-Least-Once 语义来确保容错。 阅读完这篇post和这个documentation后,我对使用检查点屏障来实现这一点有了基本的了解。

有没有一个简单的例子可以直观的检查这两种语义的区别?

我尝试过使用来自 Kafka 主题的数据(所有消息都是整数),计算窗口总和,并在某个时刻触发错误以重新启动任务。 假设 Kafka 生产者每秒生成一个整数,我的 flink 程序每 3 秒设置一次检查点并每 3 秒计算一次总和。例如:

1,2,3(checkpoint),4,5(error),6...

我的流程代码如下:

DataStream<Tuple2<String, Long>> sumData = data.flatMap(new customProcess())
.keyBy(value -> value.f0)
.window(TumblingProcessingTimeWindows.of(Time.seconds(3)))
.sum(1)
.print()

我的理解是,如果我使用 exactly-once 那么它应该打印 6(1+2+3)15(4+5+6),如果我使用 at-least-once它应该打印6(1+2+3)19(4+4+5+6),因为重新启动后,消息4将被重新处理。但我的代码没有显示这个结果。

我是否误解了什么或我的代码不正确?任何帮助将不胜感激,谢谢!

apache-flink flink-streaming
1个回答
0
投票

为了使结果具有确定性,您必须使用事件时间,而不是处理时间。先尝试一下,然后再报告。

© www.soinside.com 2019 - 2024. All rights reserved.