我的 Spark Structured Streaming 应用程序运行了几个小时,然后出现此错误而失败
java.lang.IllegalStateException: Partition [partition-name] offset was changed from 361037 to 355053, some data may have been missed.
Some data may have been lost because they are not available in Kafka any more; either the
data was aged out by Kafka or the topic may have been deleted before all the data in the
topic was processed. If you don't want your streaming query to fail on such cases, set the
source option "failOnDataLoss" to "false".
当然,偏移量每次都不同,但第一个总是大于第二个。主题数据不能过期,因为主题的保留期是 5 天,我昨天重新创建了这个主题,但今天又出现错误。从中恢复的唯一方法是删除检查点。
Spark 的 Kafka 集成指南failOnDataLoss
在选项下提到:
当数据可能丢失(例如,主题被删除或偏移量超出范围)时是否使查询失败。这可能是一个误报。当它不能按预期工作时,您可以禁用它。如果由于丢失数据而无法从提供的偏移量中读取任何数据,批量查询将始终失败。
但是我找不到任何关于何时可以将其视为误报的更多信息,所以我不知道设置是否安全,failOnDataLoss
或者false
我的集群是否存在实际问题(在这种情况下,我们实际上会失败数据)。
更新:我调查了 Kafka 日志,在 Spark 失败的所有情况下,Kafka 都记录了几条这样的消息(我假设每个 Spark 消费者都有一条消息):
INFO [GroupCoordinator 1]: Preparing to rebalance group spark-kafka-...-driver-0 with old generation 1 (__consumer_offsets-25) (kafka.coordinator.group.GroupCoordinator)