2017-09-08 199 views
0

我正在开发一个apache spark用例,我需要从kafka读取数据。我有一个非常基本的问题来理解火花从卡夫卡读取数据的方式。kafka - 多个主题vs多个分区

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

我可以通过创建多个包含每个分区的kafka主题来实现相同的方案。我可以配置我的卡夫卡制作人将数据按顺序推送到所有主题。这将在spark中创建多个dstream。然后,我可以简单地“联合”所有的dstream来创建我的unionedDstream。

现在我的问题是在于: -

将“其他dstreams的工会”创建unionedDstream将有相同数量的分区通过读取“单一话题多个分区”

创建一个为了清晰起见,我将举一个例子: -

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

在第一种方案: -

(1)1个卡夫卡话题4个分区 - > 1 DSTREAM有4个分区

在第二场景: -

(2)4个卡夫卡主题使用1个分区 - > 4个Dstream,每个分区有一个分区。

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

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

现在将“unionedDstream”变成“带有4个分区的1个Dstream”(与第一个场景相同)。如果是的话那么哪个流程会更有效果呢?

回答

2

我认为它在单节点方案中差不多,但如果您想利用Kafka的集群/负载平衡功能,您希望有多个分区。

Kafka中的水平缩放是通过在多台机器上分散消费群并在其间分配分区来实现的。这只适用于有多个分区的情况。

如果您在整个机器上分配多个主题,您可能会达到相同的效果。但是,您必须自己实现这一点,并且不能使用Kafka的内置机制。

相关问题