在多个Kafka主题的流查询中,foreachBatch包含哪些内容?

时间:2019-07-11 12:21:29

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

假设一个DataStreamReader配置为订阅多个主题(请参见here):

// Subscribe to multiple topics
spark
  .readStream
  .format("kafka")
  .option("kafka.bootstrap.servers", "host1:port1,host2:port2")
  .option("subscribe", "topic1,topic2,topic3")

在此之上使用foreachBatch时,批次将包含什么?

  • 每个批次将仅包含来自一个主题的消息?
  • 或者批处理中是否可以包含来自不同主题的消息?

在我的用例中,我只想批量处理来自一个主题的消息。可以配置吗?

2 个答案:

答案 0 :(得分:3)

Structured Streaming + Kafka Integration Guide (Kafka broker version 0.10.0 or higher)中引用官方文档:

  

//订阅多个主题

...
.option("subscribe", "topic1,topic2")

上面的代码是基础的(流查询的)Kafka使用者订阅的内容。

  

当我在此之上使用foreachBatch时,这些批次将包含什么?

     
      
  • 每个批次将仅包含来自一个主题的消息?
  •   

那是正确的答案。

  

我想批量处理仅来自一个主题的消息。可以配置吗?

Structured Streaming + Kafka Integration Guide (Kafka broker version 0.10.0 or higher)中也有记录:

  

源代码中的每一行都具有以下架构:

     

...

     

主题

换句话说,输入数据集将具有topic列,其中包含给定行(记录)所来自的主题的名称。

要使“仅接收来自一个主题的邮件” ,您只需filterwhere带有一个主题,例如

val messages: DataFrame = ...
assert(messages.isStreaming)

messages
  .writeStream
  .foreachBatch { case (df, batchId) =>
    val topic1Only = df.where($"topic" === "topic1")
    val topic2Only = df.where($"topic" === "topic2")
    ...
  }

答案 1 :(得分:1)

该批处理将包含来自您的消费者已订阅的所有主题(我要说是分区)的消息。