Spark结构化流中的端到端完全语义一次

时间:2018-08-08 09:07:02

标签: spark-structured-streaming

在以下情况下,我试图理解在语义结构化的流式传输中一旦语义受到妥协,端到端是否完全正确。

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

1 个答案:

答案 0 :(得分:1)

关于精确端到端流传输,请建议您在flink(与spark类似的框架)上阅读this poster

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

  

来自flink帖子的其他答案。

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

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