Pyspark 皮斯帕克与卡夫卡;布景不见了。有些数据可能丢失了……”;

Pyspark 皮斯帕克与卡夫卡;布景不见了。有些数据可能丢失了……”;,pyspark,apache-kafka,spark-structured-streaming,spark-streaming-kafka,Pyspark,Apache Kafka,Spark Structured Streaming,Spark Streaming Kafka,我正在本地模式下使用Spark集群运行PySpark,并试图为Kafka主题编写一个流数据帧 运行查询时,我会收到以下消息: java.lang.IllegalStateException: Set(topicname-0) are gone. Some data may have been missed.. Some data may have been lost because they are not available in Kafka any more; either the da

我正在本地模式下使用Spark集群运行PySpark,并试图为Kafka主题编写一个流数据帧

运行查询时,我会收到以下消息:

java.lang.IllegalStateException: Set(topicname-0) are gone. 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".
这是我的代码:

query=(
输出流
.writeStream.format(“卡夫卡”)
.option(“kafka.bootstrap.servers”,“localhost:9092”)
.选项(“主题”、“评级”)
.选项(“检查点位置”、“检查点文件夹”)
.start()
)
睡眠(2)
打印(查询状态)

此错误消息提示检查点存在问题。在开发过程中,这可能是由于使用带有更新查询的旧检查点文件夹造成的


如果这是在开发环境中,并且您不需要保存上一个查询的状态,那么只需删除checkpoints文件夹(
checkpoints文件夹,在代码示例中为
)然后重新运行查询。

自上次运行查询以来,当从源主题中删除某些消息/偏移量时,通常会显示此错误消息。删除是由于清除策略(如保留时间)而发生的

假设您的主题包含偏移量为0、1、2的消息,这些消息都已由应用程序处理。检查点文件存储要记住的最后一个偏移量2,下次开始时继续使用偏移量3

一段时间后,向主题生成了偏移量为3、4、5的邮件,但由于其保留,偏移量为0、1、2、3的邮件已从主题中删除

现在,当重新启动spark structured streaming作业时,它尝试根据检查点文件获取3,但发现只有偏移量为4的消息可用。在这种情况下,它将抛出此异常

你可以通过

  • readStream
    操作中设置
    选项(“failOnDataLoss”、“false”)
    ,或
  • 删除现有的检查点文件
根据以下说明,选项
failOnDataLoss
描述为:

当数据可能丢失(例如,主题被删除或偏移量超出范围)时,是否使查询失败。这可能是一个假警报。当它不能按预期工作时,您可以禁用它。如果由于数据丢失而无法从提供的偏移量中读取任何数据,批处理查询将始终失败


谢谢我的readStream代码没有指定检查点文件夹。这是否意味着整个查询使用相同的检查点位置?我有点困惑,因为并不是所有的输出流格式都需要指定检查点位置,所以我认为它是特定于输出流的。readStream是一个惰性操作,只有在使用查询的WriteStream(连同
开始
)调用时才会执行。在那里,只在writeStream中定义检查点位置就足够了。请记住,如果这些写查询都位于不同的检查点位置,那么您甚至可以有多个基于单个readStream的writestream。