Apache spark 以Kafka为源重新启动流式查询时的数据丢失场景

Apache spark 以Kafka为源重新启动流式查询时的数据丢失场景,apache-spark,spark-streaming,spark-structured-streaming,Apache Spark,Spark Streaming,Spark Structured Streaming,在“ApacheSpark的Spark流”一书中,作者提到在使用Kafka作为源进行测试时,字段“failOnDataLoss(默认值:true)”应该设置为false。他们说, 此标志指示流式查询的重新启动是否失败 以防数据丢失。这通常是在偏移超出范围时发生的 范围、删除主题或重新平衡主题。我们推荐 在开发/测试周期中将此选项设置为false,因为 使用连续生成器停止/重新启动查询端通常 引发失败。对于生产部署,将此设置回true 我想了解为什么停止/重新启动查询会失败。偏移量如何超出范围?S

在“ApacheSpark的Spark流”一书中,作者提到在使用Kafka作为源进行测试时,字段“failOnDataLoss(默认值:true)”应该设置为false。他们说,

此标志指示流式查询的重新启动是否失败 以防数据丢失。这通常是在偏移超出范围时发生的 范围、删除主题或重新平衡主题。我们推荐 在开发/测试周期中将此选项设置为false,因为 使用连续生成器停止/重新启动查询端通常 引发失败。对于生产部署,将此设置回true

我想了解为什么停止/重新启动查询会失败。偏移量如何超出范围?Spark不保留什么偏移量可以读取为检查点吗?

我认为“因为停止/重新启动具有连续生成器的查询端通常会触发失败”的原因没有真正意义。正如您所说,Spark保持当前偏移。此外,在有连续生产者的情况下停止/重新启动查询正是我们在生产系统上的目标

因此,我只能猜测这句话是什么意思,我最好的猜测是有一个打字错误,应该写在“没有连续制作人的情况下”

在开发环境中通常没有连续的生产者,为了节省一些磁盘空间,在开发环境中的主题中通常有一个较短的保留期

在开发阶段,您手动生成一些消息到输入主题,并运行Spark结构化流媒体作业,以查看其行为是否符合预期。假设您已生成偏移量为0到10的消息。然后,您团队中的某个人想要测试另一个消费者关于该主题的信息,并生成偏移量为11到20的消息。一段时间后,在下一个开发阶段(假设是3周后),您希望测试另一个功能,您将再次手动生成一些消息。但是,Kafka主题的清理策略已经删除了所有旧的偏移量0到20,当重新启动流式查询时,它会尝试读取不再存在的偏移量11

另一个常见的场景是从主题中删除开发环境中的所有数据,以便能够“从头开始”

这些场景通常出现在开发环境中,因此建议将选项
failOnDataLoss
设置为
false