Spark Structured Streaming未在Kafka偏移重新启动

时间:2017-07-25 14:59:50

标签: scala apache-spark spark-structured-streaming

我们有一个长期运行的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"开始但文件说:

This only applies when a new Streaming query is started, and that resuming will always pick up from where the query left off.

难道这不意味着重新启动我们的应用程序会导致查询从中断处继续恢复吗?

设置" group.id" Spark Structured Streaming不允许使用Kafka。请参阅:Note that the following Kafka params cannot be set and the Kafka source will throw an exception.

我尝试添加queryName,以防用于在运行中识别查询但它没有任何效果。

我们在YARN上使用Spark 2.1。

关于为什么这不起作用或我们做错了什么的任何想法?

更新日志:

From the Driver

From the Worker

1 个答案:

答案 0 :(得分:0)

首先,为什么要说再次创建检查点目录。您是在初次运行后将其删除然后恢复吗?

因此,为清楚起见,首次启动查询时,将从头开始读取“ .option(“ startingOffsets”,“最早”)“设置。 并考虑到出现了问题,并且流停止了。您对其进行了修复,然后再次启动流(不删除检查点目录),该流应从先前已停止的偏移处开始。

如果您已经删除了检查点目录,然后又恢复了流,则显然不会读取任何偏移量的历史记录(因为您删除了检查点),因此将从第一个(最早的)偏移量开始在kafka上可用。