apache-spark - Kafka 消费者组和具有 Spark 结构化流的分区
问题描述
我有一个带有 3 个分区的 Kafka 主题,我正在使用 spark 结构化流处理这些数据。我有 3 个消费者(假设是消费者组 A)每个从单个分区读取,直到这里一切都是工作文件。
我有一个从同一个主题读取的新要求,我想通过再次创建 3 个消费者(比如消费者组 B)来并行化它,每次从单个分区读取。由于我使用的是结构化流,我无法group.id
明确提及。
来自指向单个/相同分区的不同组的消费者会读取所有数据吗?
解决方案
除非您使用的是 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,这允许两个作业独立于另一个作业读取来自该主题的所有消息。
推荐阅读
- javascript - 从源“http://localhost:3000”访问“http://localhost:8080/”的 XMLHttpRequest 已被 CORS 策略阻止
- python - Qt 设计器和 loadUi 函数
- java - 我正在尝试添加一个单词过滤器,但它似乎不起作用
- nginx - 如何在 NGINX 的代理响应中替换 URL
- qt - Qt 将 QScrollBar 与 QLineEdit 连接起来
- c# - 如何使用 advapi32 在 C# 中加密文件?
- python-3.x - 当用户决定按“输入”而不给出值时,有没有办法自动输入值“1”?
- flutter - 如何在flutter中显示数据或操作复杂的json
- c++ - 返回通过分支路径的变量的最佳实践?
- flutter - Flutter错误:使用flutter下载器包下载后无法从通知栏打开文件