Kafka Streams如何分配分区?

时间:2018-04-27 21:52:24

标签: apache-kafka-streams

我有一个Kafka Streams应用程序,它将主题-1中的数据作为KStream,将主题-2作为KTable接收。这两个主题各有4个分区。假设我有4个应用程序实例正在运行,那么每个实例将从主题-1的单个分区接收数据。如果以KTable收到主题-2怎么样?在这种情况下,是否所有实例都将从所有4个分区接收数据?如果两个主题都是相同的,那么我猜Kafka Streams将确保为应用程序分配相同的分区。如果topic-2没有任何密钥,而是应用程序将从值本身推断出,那么这意味着所有实例都需要从topic-2获取所有分区。 Kafka Streams如何处理这种情况?

谢谢!

1 个答案:

答案 0 :(得分:4)

KTables根据输入分区进行分片。因此,类似于KStream,每个实例将分配一个主题分区,并将此主题分区具体化为KTable的分片。 Kafka Streams确保不同主题的主题分区位于同一位置,即一个实例将被分配topic-1 partition-0topic-2 partition-0(等等)。

如果topic-2没有设置密钥,则数据将随机分布在主题中。对于这种情况,您可以使用GlobalKTable代替。 GlobalKTable是每个实例的所有分区的完全复制。如果您执行KStream-GlobalKTable-join,则可以指定一个“映射器”,从表中提取join属性(即,您可以从值中提取join属性)。

  

注意:KStream-GlobalKTable连接具有与KStream-KTable连接不同的语义。与后者相比,它不是时间同步的,因此,就GlobalKTable更新而言,连接在设计上是不确定的;即,无法保证KStream记录将首先“看到”GlobalKTable更新,从而加入更新的GlobalKTable记录。