apache-spark - kafka - 多个主题与多个分区

标签 apache-spark apache-kafka

我正在研究一个 apache Spark 用例,我需要从 kafka 读取数据。我有一个非常基本的问题来了解 Spark 从 kafka 读取数据的方式。

根据我的理解,如果数据速度和数据量很高,那么我可以在kafka中创建多个分区并在spark中读取它。现在dstream中的分区数量与kafka中的分区数量相同。

我可以通过创建多个kafka主题(每个主题一个分区)来实现相同的场景吗?我可以配置我的 kafka 生产者将数据按顺序推送到所有主题。这将在 Spark 中创建多个 dstream。然后我可以简单地“联合”所有 dstream 来创建我的 unionedDstream 。

现在我的问题是:-

通过“union of other dstreams”创建的 unionedDstream 的分区数量是否与通过阅读“具有多个分区的单个主题”创建的分区数量相同

为了清楚起见,我将在下面举一个例子:-

我有单一生产者和单一消费者。

在第一种情况下:-

(1) 1 个具有 4 个分区的 Kafka 主题 --> 1 个具有 4 个分区的 Dstream

在第二种情况下:-

(2) 4 个 Kafka Topic,每个主题 1 个分区 --> 4 个 Dstream,每个主题 1 个分区。

但是在这里我可以“联合”所有 dstream 以创建单个 dstream。

unionedDstream= dstream1.union(dstream2).union(dstream3).union(dstream4)

现在“unionedDstream”将变为“1 个具有 4 个分区的 Dstream”(与第一种情况相同)。如果是,那么哪个流程的性能会更有效?

最佳答案

我认为在单节点场景中它或多或少是相同的,但是如果你想利用 Kafka 的集群/负载均衡功能,你需要有多个分区。

Kafka 中的水平扩展是通过将消费者组分布在多台机器上并在它们之间分配分区来实现的。这仅在您有多个分区时才有效。

如果您在计算机上分布多个主题,则可能会达到相同的效果。但是,您必须自己实现这一点,并且无法利用 Kafka 的内置机制。

关于apache-spark - kafka - 多个主题与多个分区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46110007/

相关文章:

scala - 迭代数据框中的每一行,将其存储在 val 中并作为参数传递给 Spark SQL 查询

scala - 从mapValues或flatMapValues访问 key ?

scala - 找不到记录器的附加程序(org.apache.kafka.clients.consumer.ConsumerConfig)

docker - 如何在Docker环境中访问Kafka Connector(融合日志连接)

apache-kafka - 针对多个主题拥有标准化的 Kafka Producer 微服务是一种反模式吗?

apache-kafka - 卡夫卡消费者寻求开始

apache-spark - yarn 群集模式下的Pyspark

json - 如何在 Spark Scala 中读取嵌套 JSON?

scala - Spark : Get max consecutive decrease in value

apache-kafka - 卡夫卡 : sendOffsetsToTransaction with multiple consumers