共同分区如何确保将来自2个不同主题的分区最终分配给相同的Kafka Stream Task?

时间:2019-07-26 12:58:10

标签: apache-kafka apache-kafka-streams

虽然我了解此处Why does co-partitioning of two Kstreams in kafka require same number of partitions for both the streams?所述的进行共同分区的前提条件,但我不了解确保每个主题的分区具有相同键的分配给相同分区的机制KAFKA流。我不知道KAFKA的消费者群体将如何实现这一目标。

我的理解方式是,我们有2个独立的消费者组,实际上它们可能具有相同的名称,因为它是相同的kafka流应用程序,尽管每个主题的订阅都相互独立。

以某种方式,每个使用者组中的使用者被分配到包含相同密钥的分区。我不知道消费者对分区的分配可能与分区的内容有关。到目前为止,我虽然是随机的。

有人可以解释这部分吗?

2 个答案:

答案 0 :(得分:1)

刷新后,我发现以下两个说明了这一切:

A consumer group has a unique id. Each consumer group is a subscriber to one or more Kafka topics.

因此,消费者组可能涉及多个主题及其分区以及将其分配给该组消费者的策略。

PARTITION.ASSIGNMENT.STRATEGY (在Kafka权威指南中)

PartitionAssignor是一个类,根据给定的使用者和他们订阅的主题,它决定将哪个分区分配给哪个使用者。默认情况下,Kafka具有两种分配策略:

  • 范围:为每个消费者分配其订阅的每个主题的连续分区子集。因此,如果消费者C1和C2订阅了两个主题T1和T2,并且每个主题都有三个分区,那么C1将被分配给主题T1和T2的分区0和1,而C2将被分配给那些主题的分区2 。因为每个主题的分区数量都很不均匀,并且每个主题的分配都是独立完成的,所以第一个使用方最终比第二个使用方拥有更多的分区。每当使用范围分配并且使用方数量没有将每个主题中的分区数量整齐地划分时,就会发生这种情况。

换句话说,如果分区数相同,并且每个主题的生产者的分区策略相同,则具有相同关键字的消息将以相同的方式分配到分区范围上,该范围被分配给消费者的使用方式相同,即每个主题的分区的连续子集。因此,相同的流任务将始终具有两个具有相同键的主题的分区。

答案 1 :(得分:1)

  

我的理解是,我们有2个独立的消费者组,实际上它们可能具有相同的名称,因为它是相同的kafka流应用程序,尽管每个主题的订阅彼此独立。

使用者组的所有成员都具有相同的“名称”(即group.id)-不可能有两个使用者组具有相同的名称。它将是一个消费群体。

  

尽管每个主题的订阅彼此独立

对于KafkaConsumer,可以为组中的不同成员进行不同的订阅(即使这种情况很少见)。但是,对于Kafka Streams,要求该组的所有成员(即应用程序实例)执行与某些输入主题完全相同的Topology(即,其订阅必须相同)。

  

我不知道消费者对分区的分配可能与分区的内容有关。到目前为止,尽管它是随机的。

是的。

根据您自己的答案:

  

换句话说,如果分区数相同,并且每个主题的生产者的分区策略相同,则具有相同关键字的消息将以相同的方式分配到分区范围上,该范围被分配给消费者以相同的方式,即作为每个主题的分区的连续子集。因此,同一流任务将始终具有两个具有相同键的主题的分区。

那也是正确的。

请注意,Kafka Streams使用特殊的分区分配器(不是用户提供的默认分区分配器)来确保共同分区,粘性(即状态存储感知)并分配备用任务。