【问题标题】:How to ensure that related events are processed together in Spark Structured Streaming?Spark Structured Streaming中如何保证相关事件一起处理?
【发布时间】:2025-12-13 14:25:08
【问题描述】:

我有一个用例,我需要从 kafka 中的主题读取事件并在 Spark 中处理它们。 我需要处理与同一元素相关的事件(在事件消息中指定元素标识符)并且在一个时间范围内一起发生。

  1. 如果相关事件分布在 kafka 分区中,那么考虑到 spark 的多个执行器架构,我们如何一起读取所有相关事件?

  2. 是否可以强制所有相关事件都转到 kafka 中的同一个分区? Spark 结构化流将如何利用它?

【问题讨论】:

    标签: python apache-spark pyspark apache-kafka


    【解决方案1】:

    1.如果您想以并行形式接收数据,那么您应该使用相同的主题创建多个接收器并使用您的streamingContext将它们联合起来,这样您就可以并行接收数据。

    注意事项:

    1. 执行者的数量至少应等于接收者的数量
    2. 设置每个执行程序的核心数,以便执行程序有一些备用 容量超过运行接收器所需的容量
    3. 核心总数必须大于接收器数量; 否则应用程序将无法处理它收到的数据

    我对 kafka 了解不多,但我是在 MQTT 中完成的。

    如果你想知道我是怎么做到的,请告诉我

    在 Scala 中::

     val streams = (0 to 3).map{i => KafkaUtils.createStream(......)}
     val uniStream = streamingContext.union(streams)
    

    【讨论】:

    • 这是否也适用于结构化流媒体?
    • 我不确定结构化流,我认为可以通过使用自己的线程池,但不确定
    • 但我确定 Spark Streaming。您可以创建多个接收器,这些接收器将在 diff 执行器上启动并并行接收数据。我认为如果您正在寻找并行接收数据,那么这就是最好的方法