端到端恰好一次 Spark 结构化流中的语义



我试图了解在以下情况下,一旦语义在 Spark 结构化流中受到损害,端到端是否恰好如此。

方案:启动具有 kafka 源和文件接收器的结构化流式处理作业。Kafka 有 16 个分区,我正在使用 16 个执行器阅读。我在特定批次未完成的那一刻中断了工作。16 个任务中的 8 个已完成,我们生成了 8 个输出文件。现在,如果我再次运行作业,批处理将启动并从先前未完成批处理的相同偏移范围读取数据,生成 16 个输出文件。现在,不完整批次的8个输出文件导致重复,并且已通过数据比较确认相同。

关于端到端流 恰好一次,强烈建议您在 flink 上阅读这张海报(一个与 Spark 类似的框架(。

简而言之,在发生检查点事件时存储源/接收器状态。

来自 Flink 帖子的其余部分。

因此,让我们将所有这些不同的部分放在一起:

  • 一旦所有运算符完成其预提交,他们就会发出提交。
  • 如果至少有一个预提交失败,所有其他预提交都将中止,我们将回滚到上一个成功完成的检查点。
  • 在成功的预提交之后,必须保证提交最终成功 - 我们的操作员和外部系统都需要做出此保证。如果提交失败(例如,由于间歇性网络问题(,整个 Flink 应用程序将失败,应用程序将根据用户的重启策略重新启动,并且还有另一次提交尝试。此过程至关重要,因为如果提交最终未成功,则会发生数据丢失。

最新更新