繁体   English   中英

从 Kafka 主题读取流时,Spark Structured Streaming 是否存在超时问题?

[英]Does Spark Structured Streaming have some timeout issue when reading streams from a Kafka topic?

我实现了一个火花作业,以在结构化流中使用 foreachbatch 从 kafka 主题读取流。

val df = spark.readStream
  .format("kafka")
  .option("kafka.bootstrap.servers", "mykafka.broker.io:6667")
  .option("subscribe", "test-topic")
  .option("kafka.security.protocol", "SASL_SSL")
  .option("kafka.ssl.truststore.location", "/home/hadoop/cacerts")
  .option("kafka.ssl.truststore.password", tspass)
  .option("kafka.ssl.truststore.type", "JKS")
  .option("kafka.sasl.kerberos.service.name", "kafka")
  .option("kafka.sasl.mechanism", "GSSAPI")
  .option("groupIdPrefix","MY_GROUP_ID")
  .load()

val streamservice = df.selectExpr("CAST(value AS STRING)")
  .select(from_json(col("value"), schema).as("data"))
  .select("data.*")


var stream_df = streamservice
  .selectExpr("cast(id as string) id", "cast(x as int) x")

val monitoring_stream = stream_df.writeStream
  .trigger(Trigger.ProcessingTime("120 seconds"))
  .foreachBatch { (batchDF: DataFrame, batchId: Long) =>
    if(!batchDF.isEmpty) { }
  }
  .start()
  .awaitTermination()

我有以下问题。

  1. 如果kafka topic长时间没有数据,stream_df.writeStream会自动终止吗? 是否有一些超时控制?

  2. 如果 kafka 主题从 kafka broker 中删除,stream_df.writeStream 会终止吗?

我希望在上述两种情况下,spark作业继续监控kafka主题而不终止。 我是否需要为 kafka 连接器和/或 stream_df.writerstream 进行一些特殊设置?

  1. 如果kafka topic长时间没有数据,stream_df.writeStream会自动终止吗? 是否有一些超时控制?

查询的终止与正在处理的数据无关。 即使没有向您的 Kafka 主题生成新消息,查询也会继续运行,因为它是作为流运行的。

我想这就是你在测试时已经想出来的。 我们正在使用结构化流查询来处理来自 Kafka 的数据,并且它们不会出现长时间闲置的问题(例如在工作时间以外的周末)。

  1. 如果 kafka 主题从 kafka broker 中删除,stream_df.writeStream 会终止吗?

默认情况下,如果您在查询运行时删除 Kafka 主题,则会引发异常:

ERROR MicroBatchExecution: Query [id = b1f84242-d72b-4097-97c9-ee603badc484, runId = 752b0fe4-2762-4fff-8912-f4cffdbd7bdc] terminated with error
java.lang.IllegalStateException: Partition test-0's offset was changed from 1 to 0, 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".

我提到“默认”是因为查询选项failOnDataLoss默认为true 如异常消息中所述,您可以将其设置为 false 以让您的流查询运行。 此选项在结构化流 + Kafka 集成指南中描述为:

“当数据可能丢失(例如,主题被删除,或偏移量超出范围)时是否使查询失败。这可能是一个误报。当它没有按预期工作时,您可以禁用它。”

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM