我正在处理一个apachespark用例,在这个用例中我需要从kafka读取数据。我有一个非常基本的问题来理解spark读取Kafka数据的方式。
根据我的理解,如果数据速度和容量都很高,那么我可以在kafka中创建多个分区并在spark中读取。现在dstream中的分区数与kafka中的分区数相同。
我可以通过创建多个kafka主题(每个主题有一个分区)来实现相同的场景吗。我可以配置我的Kafka生产者推数据到所有的主题顺序。这将在spark中创建多个数据流。然后我可以简单地“联合”所有的数据流来创建我的UnionedStream。
现在我的问题是:
由“union of other dstream”创建的unioneddstream的分区数是否与通过读取“single topic with multiple partitions”创建的分区数相同
我将在下面举一个例子clarity:-
我只有一个生产者和一个消费者。
首先scenario:-
(1) 1个Kafka主题和4个分区-->1个数据流和4个分区
以秒计scenario:-
(2) 4个Kafka主题,每个1个分区-->4个数据流,每个1个分区。
但是在这里我可以“联合”所有的数据流来创建一个单独的数据流。
unionedDstream= dstream1.union(dstream2).union(dstream3).union(dstream4)
现在“unioneddstream”将变为“具有4个分区的1dstream”(与第一个场景相同)。如果是的话,那么哪个流程在绩效方面更有效?
1条答案
按热度按时间cyvaqqii1#
我假设它在单节点场景中或多或少是相同的,但是如果您想利用kafka的集群/负载平衡特性,您需要有多个分区。
kafka中的水平扩展是通过将一个消费群体分布在多台机器上并在它们之间分配分区来实现的。这只在有多个分区时有效。
如果将多个主题分发到多台计算机上,则可能会达到相同的效果。然而,你必须自己实现这一点,不能利用Kafka的内在机制。