我正在研究一个 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/