首页 > 解决方案 > 重新启动以 Kafka 作为源的流式查询时的数据丢失情况

问题描述

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

此标志指示是否在可能丢失数据的情况下重新启动流式查询失败。这通常发生在偏移量超出范围、删除主题或重新平衡主题时。我们建议在开发/测试周期中将此选项设置为 false,因为使用连续生产者停止/重新启动查询端通常会触发失败。将此设置回 true 以进行生产部署。

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

标签: apache-sparkspark-streamingspark-structured-streaming

解决方案


我同意“因为使用连续生产者停止/重新启动查询端通常会触发失败”的原因并没有真正的意义。正如您所说,Spark 维护当前的偏移量。此外,在拥有连续生产者的同时停止/重新启动查询正是我们在生产系统上的目标。

因此,我只能猜测该语句的含义,我最好的猜测是有一个错字,应该写成“没有连续的生产者”。

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

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

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

这些场景经常出现在开发环境中,因此建议将选项设置failOnDataLossfalse.


推荐阅读