重新启动以Kafka为源的流查询时的数据丢失情况

时间:2019-06-16 10:41:10

标签: apache-spark spark-streaming spark-structured-streaming

在《用Apache Spark进行火花流传输》一书中,作者提到在使用Kafka作为源进行测试时,应将字段“ failOnDataLoss(default:true)”设置为false。他们说,

  

此标志指示是否无法重新启动流查询   以防数据丢失。通常是当偏移量超出   范围,删除主题或重新平衡主题。我们推荐   在开发/测试周期中将此选项设置为false,因为   停止/重新启动具有连续生产者的查询端通常会   触发失败。将该值重新设置为true即可进行生产部署。

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

1 个答案:

答案 0 :(得分:0)

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

因此,我只能猜测那句话的意思,我最好的猜测是有一个错字,它应该写成“没有连续生产者”。

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

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

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

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