我是Flink的新手,我正在尝试编写一次具有精确语义的简单流作业,该作业从Kafka侦听并将数据写入S3。当我说“精确一次”时,我的意思是我不想在写入S3和提交文件接收器运算符之间出现中间故障时出现重复。根据this page中描述的连接器,我正在使用v2.5.0版本的Kafka,我猜测我的用例最终将具有确切的一次行为。
问题:
1)我的假设是否正确,即即使在步骤的任何部分发生任何故障,我的用例都会准确地使用一次,以便我可以说我的S3文件不会有重复的记录?
2)Flink如何使用S3一次精确地处理?它在documentation中说,它使用分段上传来获取精确的一次语义,但是我的问题是,如何在内部处理它以实现精确的一次语义?假设,一旦S3多部分程序成功并且在操作员提交过程之前任务失败,在这种情况下,一旦操作员重新启动,是否会将数据再次流到已写入S3的S3,所以它会重复吗?
如果您从kafka读取,然后使用StreamingDataSink写入S3,则确实应该可以得到一次。
尽管不是专门针对S3,但本文对如何确保一次准确地给出了很好的解释。
https://flink.apache.org/features/2018/03/01/end-to-end-exactly-once-apache-flink.html
我的主要要点:失败之后,我们必须始终能够从水槽的角度看到我们的立场。