apache-kafka-streams - Kafka Streams 如何分配分区?
问题描述
我有一个 Kafka Streams 应用程序,它从 topic-1 asKStream
和 topic-2 as接收数据KTable
。两个主题各有 4 个分区。假设我有 4 个应用程序实例正在运行,那么每个实例都会从 topic-1 的单个分区接收数据。收到的 topic-2 怎么样KTable
?在这种情况下,所有实例都会从所有 4 个分区接收数据吗?如果两个主题的关键字相同,那么我猜 Kafka Streams 将确保为应用程序分配相同的分区。如果 topic-2 没有任何键,而是应用程序从值本身推断,那么这意味着所有实例都需要从 topic-2 获取所有分区。Kafka Streams 如何处理这种情况?
谢谢!
解决方案
KTables
根据输入分区进行分片。因此,与 a 类似KStream
,每个实例将分配一个主题分区并将该主题分区具体化为KTable
. Kafka Streams 确保不同主题的主题分区位于同一位置,即一个实例将被分配topic-1 partition-0
和topic-2 partition-0
(等等)。
如果topic-2
没有键集,数据将随机分布在主题中。对于这种情况,您可以使用 aGlobalKTable
代替。AGlobalKTable
是每个实例的所有分区的完整复制。如果你做一个KStream-GlobalKTable-join,你可以指定一个从表中提取连接属性的“映射器”(即,你可以从值中提取连接属性)。
注意:KStream-GlobalKTable 连接与 KStream-KTable 连接具有不同的语义。与后者相比,它不是时间同步的,因此,对于 GlobalKTable 更新,连接在设计上是不确定的;即,不能保证哪个 KStream 记录将首先“看到” GlobalKTable 更新并因此加入更新的 GlobalKTable 记录。
推荐阅读
- python - 如何使用“pip --user”方法“conda env create -f environment.yml”
- bash - 通过管道从标准输出中剪切和排序分隔日期
- timezone - 在 Luxon 中设置时间并以用户的本地时区显示
- sql - 在也被分组的列上聚合
- r - Tidyverse:If_else + str_length + str_pad 改变 1 列
- swift - Inout 和 NSMutableDictionary
- gnu-assembler - 在 ARM GAS 汇编器中正确使用 MOD 运算符
- javascript - 如何将对象推入循环内的嵌套数组中?
- javascript - 没有互联网连接时,如何禁用所有锚点?
- css - 为什么 Safari 在开发工具中使用和显示错误的 CSS 类?