Apache spark Spark Structured Streaming-由于输入源数量增加,检查点中出现断言错误

Apache spark Spark Structured Streaming-由于输入源数量增加,检查点中出现断言错误,apache-spark,apache-spark-sql,spark-structured-streaming,Apache Spark,Apache Spark Sql,Spark Structured Streaming,我正在尝试将两个流合并为一个流,并将结果写入一个主题 string2json.writeStream.format("kafka") .option("kafka.bootstrap.servers", xxxx:9092") .option("topic", "toDelete") .option("checkpointLocation", &q

我正在尝试将两个流合并为一个流,并将结果写入一个主题

  string2json.writeStream.format("kafka")
      .option("kafka.bootstrap.servers", xxxx:9092")
      .option("topic", "toDelete")
      .option("checkpointLocation", "checkpoints")
      .option("failOnDataLoss", "false")
      .start()
      .awaitTermination()
代码: 1-阅读两个主题

val PERSONINFORMATION\u df:DataFrame=spark.readStream
.格式(“卡夫卡”)
.option(“kafka.bootstrap.servers”,“xx:9092”)
.期权(“认购”、“个人信息”)
.选项(“组id”、“信息”)
.选项(“maxOffsetsPerTrigger”,1000)
.选项(“起始偏移量”、“最早”)
.load()
val CANDIDATEINFORMATION_df:DataFrame=spark.readStream
.格式(“卡夫卡”)
.option(“kafka.bootstrap.servers”,“xxx:9092”)
.期权(“认购”、“候选信息”)
.选项(“group.id”、“candent”)
.选项(“起始偏移量”、“最早”)
.选项(“maxOffsetsPerTrigger”,1000)
.选项(“failOnDataLoss”、“false”)
.load()
2-解析数据以加入它们:

val parsed_PERSONINFORMATION_df: DataFrame = PERSONINFORMATION_df
      .select(from_json(expr("cast(value as string) as actualValue"), schemaPERSONINFORMATION).as("s")).select("s.*")

   val parsed_CANDIDATEINFORMATION_df: DataFrame = CANDIDATEINFORMATION_df
      .select(from_json(expr("cast(value as string) as actualValue"), schemaCANDIDATEINFORMATION).as("s")).select("s.*")

   val df_person = parsed_PERSONINFORMATION_df.as("dfperson")
   val df_candidate = parsed_CANDIDATEINFORMATION_df.as("dfcandidate")
3-连接两个框架

  val joined_df : DataFrame = df_candidate.join(df_person, col("dfcandidate.PERSONID") === col("dfperson.ID"),"inner")

  val string2json: DataFrame = joined_df.select($"dfcandidate.ID".as("key"),to_json(struct($"dfcandidate.ID", $"FULLNAME", $"PERSONALID")).cast("String").as("value"))
4-将它们写在一个主题上

  string2json.writeStream.format("kafka")
      .option("kafka.bootstrap.servers", xxxx:9092")
      .option("topic", "toDelete")
      .option("checkpointLocation", "checkpoints")
      .option("failOnDataLoss", "false")
      .start()
      .awaitTermination()
错误消息:

    21/01/25 11:01:41 ERROR streaming.MicroBatchExecution: Query [id = 9ce8bcf2-0299-42d5-9b5e-534af8d689e3, runId = 0c0919c6-f49e-48ae-a635-2e95e31fdd50] terminated with error
java.lang.AssertionError: assertion failed: There are [1] sources in the checkpoint offsets and now there are [2] sources requested by the query. Cannot continue.
       

在我看来,您的代码很好,这是检查点导致的问题

根据您收到的错误消息,您可能仅使用一个流源运行此作业。然后,您添加了流连接的代码,并尝试在不删除现有检查点文件的情况下重新启动应用程序。现在,应用程序尝试从检查点文件恢复,但发现最初只有一个源,现在有两个源

本节解释了使用检查点时允许和不允许的更改。不允许更改输入源的数量:

“输入源的数量或类型(即不同的源)的更改:这是不允许的。”


要解决您的问题,请删除当前的检查点文件并重新启动作业。

谢谢,但如何删除检查点文件?每次通过代码还是手动@mikeyou只需要手动删除它们一次。一旦你删除了它们,并且没有根据我共享的链接更改代码,你就不必再删除它了。谢谢你,我创建了一个新的检查点文件,现在一切都很顺利