如何使用Spark结构化流管理从Kafka读取的偏移

时间:2019-05-15 08:35:14

标签: scala spark-structured-streaming

我正在执行一个火花结构化的流作业,该作业需要从kafka主题中读取数据并进行一些聚合。该作业需要每天重新启动,但是如果重新启动,那么如果设置startingOffsets="latest",我将丢失重新启动时间之间的数据。如果我设置了startingOffsets="earliest",则该作业将从主题中读取所有数据,但不会从上一个流作业留下的位置读取所有数据。谁能帮助我如何配置以将偏移量设置在最后一个流作业剩余的位置?

我使用的是 Spark 2.4.0 kafka 2.1.1 ,我试图为书写作业设置检查点位置,但似乎Spark并没有检查kafka消息的偏移量,以便它继续检查上一个偏移量或第一个偏移量,具体取决于startingOffsets。

这是我的火花从卡夫卡读取的配置:

val df = spark.readStream
         .format("kafka")
         .option("kafka.bootstrap.servers", host)
         .option("subscribe", topic)
         .option("startingOffsets", offset)
         .option("enable.auto.commit", "false")
         .load()

例如,kafka主题有10条消息,其偏移量从1到10,触发刚刚完成处理消息5,然后重新启动。我该如何使spark继续从消息5而不是从1或11读取?

1 个答案:

答案 0 :(得分:0)

似乎可以通过一些代码获取所需的偏移量并将其保存到诸如cassandra之类的可靠存储中。然后,当火花流开始时,我只需要读取保存的偏移并将其填充到startingOffsets即可。 这是帮助我获得所需偏移量的代码

vectorizer = TfidfVectorizer(encoding='latin-1',sublinear_tf=True, max_df=0.5, stop_words='english')