首页 > 解决方案 > Kafka 消费者组和具有 Spark 结构化流的分区

问题描述

我有一个带有 3 个分区的 Kafka 主题,我正在使用 spark 结构化流处理这些数据。我有 3 个消费者(假设是消费者组 A)每个从单个分区读取,直到这里一切都是工作文件。

我有一个从同一个主题读取的新要求,我想通过再次创建 3 个消费者(比如消费者组 B)来并行化它,每次从单个分区读取。由于我使用的是结构化流,我无法group.id明确提及。

来自指向单个/相同分区的不同组的消费者会读取所有数据吗?

标签: apache-sparkapache-kafkaspark-structured-streaming

解决方案


除非您使用的是 Spark 3.x 或更高版本,否则您将无法group.id在 Kafka 输入流中设置 。正如您所提到的,使用 Spark 3.x,您可以拥有两个不同的结构化流作业,提供两个不同的 group.id,以确保每个作业独立于其他作业读取主题的所有消息。

对于 Spark 版本 <= 2.4.x,Spark 本身将为您创建一个独特的消费者组,您可以在 GitHub 上的代码中查找:

// Each running query should use its own group id. Otherwise, the query may be only 
// assigned partial data since Kafka will assign partitions to multiple consumers having
// the same group id. Hence, we should generate a unique id for each query.
val uniqueGroupId = s"spark-kafka-source-${UUID.randomUUID}-${metadataPath.hashCode}"

因此,同样在这种情况下,拥有两个不同的 Streaming Jobs 将确保您拥有两个不同的 ConsumerGroup,这允许两个作业独立于另一个作业读取来自该主题的所有消息。


推荐阅读