[英]Spark Structured Streaming not restarting at Kafka offsets
我们有一个长期运行的 Spark Structured Streaming 查询,它正在从 Kafka 读取数据,我们希望这个查询在重启后从停止的地方开始。 但是,我们将startingOffsets
设置为“ earliest
”,重新启动后我们看到查询再次从Kafka 主题的开头读取。
我们的基本查询如下所示:
val extract = sparkSession
.readStream
.format("kafka")
.option("kafka.bootstrap.servers", "server:port")
.option("subscribe", "topic")
.option("startingOffsets", "earliest")
.load()
val query: StreamingQuery = extract
.writeStream
.option("checkpointLocation", s"/tmp/checkpoint/kafka/")
.foreach(writer)
.start()
我们看到检查点目录被正确创建,并且在偏移文件中具有我们期望的偏移量。
当我们重新启动时,我们会看到如下消息:
25-07-2017 14:35:32 INFO ConsumerCoordinator:231 - Setting newly assigned partitions [KafkaTopic-2, KafkaTopic-1, KafkaTopic-0, KafkaTopic-3] for group spark-kafka-source-dedc01fb-c0a7-40ea-8358-a5081b961968--1396947302-driver
我们告诉查询从“ earliest
”开始,但文档说:
这仅适用于启动新的 Streaming 查询时,并且恢复将始终从查询停止的位置开始。
这不应该意味着重新启动我们的应用程序会导致查询从停止的地方恢复吗?
Spark Structured Streaming 不允许为 Kafka 设置“ group.id
”。 看这个: 注意下面的Kafka参数不能设置,Kafka源会抛出异常。
我尝试添加queryName
,以防它被用来识别跨运行的查询,但它没有任何效果。
我们在 YARN 上使用 Spark 2.1。
关于为什么这不起作用或我们做错了什么的任何想法?
更新日志:
首先,你为什么说再次创建检查点目录。 您是否在初始运行后将其删除,然后再继续运行?
因此,要清楚“.option(“startingOffsets”,“earliest”)”设置将从您第一次启动查询时的最开始读取。 并考虑出现问题,并且流停止了。 您修复它并再次启动流(不删除检查点目录)流应该从它之前停止的偏移量开始。
如果您删除了检查点目录然后恢复了流,显然它不会读取任何偏移量的历史记录(因为您已经删除了检查点),因此将从第一个(最早的)偏移量开始卡夫卡。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.