我正在研究一个apache spark用例,我需要从kafka读取数据。我有一个非常基本的问题来理解spark从kafka读取数据的方式。
根据我的理解,如果数据速度和数量很高,那么我可以在kafka中创建多个分区并在spark中读取它。现在,dstream中的分区数与kafka中的分区数相同。
我是否可以通过创建多个kafka主题来实现相同的方案,每个主题都有一个分区。我可以配置我的kafka生产者以顺序方式将数据推送到所有主题。这将在spark中创建多个dstream。然后,我可以简单地"结合"所有dstream创建我的unionedDstream。
现在我的问题是: -
unionedDstream是否会由"其他dstream"的联合创建?将具有与通过阅读"单个主题和多个分区创建的分区相同数量的分区"
为了清楚起见,我将在下面举一个例子: -
我有单身生产者和单身消费者。
在第一种情况中: -
(1)1个有4个分区的Kafka主题 - > 1个带4个分区的Dstream
在第二种情况中: -
(2)4个Kafka主题,每个分区有1个分区 - > 4 Dstream,每个都有一个分区。
但在这里我可以"结合"所有dstream都可以创建单个dstream。
unionedDstream= dstream1.union(dstream2).union(dstream3).union(dstream4)
现在将" unionedDstream"成为" 1 Dstream有4个分区" (与第一种情况相同)。如果是,那么哪个过程在性能方面会更有效?
答案 0 :(得分:3)
我认为在单节点方案中它或多或少相同,但是如果你想使用Kafka的集群/负载平衡功能,你想拥有多个分区。
Kafka中的水平扩展是通过在多台计算机上分布一个使用者组并在其中分配分区来实现的。这仅在您有多个分区时才有效。
如果您在机器之间分配多个主题,则可能会达到相同的效果。但是,您必须自己实现,不能使用Kafka的内置机制。