Flink exact once 使用 S3 sink 进行流式传输

Flink exact once streaming with S3 sink

我是 Flink 的新手,我正在尝试编写一个简单的流式作业,它具有从 Kafka 侦听并将数据写入 S3 的恰好一次语义。当我说 "Exact once" 时,我的意思是我不想在写入 S3 和提交文件接收器操作符之间的中间失败时出现重复。根据 this page 中描述的连接器,我正在使用 v2.5.0 版的 Kafka,我猜我的用例最终将具有精确的一次行为。

问题:

1) 我的假设是否正确,即即使步骤的任何部分出现任何故障,我的用例最终也会有 exact once,这样我就可以说我的 S3 文件不会有重复记录?

2) Flink 如何用 S3 处理这个 exact once?在 documentation 它说,它使用分段上传来获得精确一次语义,但我的问题是,它是如何在内部处理以实现精确一次语义的?比方说,一旦 S3 多部分成功并且在操作员提交过程之前任务失败,在这种情况下,一旦操作员重新启动,它将再次将数据流式传输到已经写入 S3 的 S3,那么它会是重复的吗?

如果您从 kafka 读取然后使用 StreamingDataSink 写入 S3,您确实应该能够恰好获得一次。

虽然不是专门针对 S3,但这篇文章很好地解释了一般情况下如何确保恰好一次。

https://flink.apache.org/features/2018/03/01/end-to-end-exactly-once-apache-flink.html

我的要点:失败后,我们必须始终能够从水槽的角度看清自己的立场。