gpt4 book ai didi

apache-kafka - Kafka Streams 处理器 - 状态存储和输入主题分区

转载 作者:行者123 更新时间:2023-12-02 20:41:15 28 4
gpt4 key购买 nike

我想完全理解 kafka-streams 处理器在处理器输入及其状态分区方面必须遵守的规则。具体来说我想了解:

  1. 是否可能,使用与输入主题的 key 不同的状态存储 key 会产生什么潜在后果
  2. 状态存储 key 是否跨分区共享,即如果我在处理器处理属于两个不同分区的记录时尝试访问处理器中的相同 key ,是否会获得相同的值

我一直在对此进行一些研究,我发现的答案似乎不是很清楚,有时甚至是矛盾的:例如this one似乎表明商店是完全独立的,你可以使用任何键,而 this one表示您永远不应该使用与输入主题中的 key 不同的 key 的商店。

感谢您的澄清。

最佳答案

您必须区分输入分区和存储分片/变更日志主题分区才能获得完整的图片。另外,这取决于您使用 DSL 还是处理器 API,因为 DSL 会进行一些自动重新分区,但处理器 API 不会。因为 DSL 编译为处理器 API,所以我将从这里开始。

如果您有一个主题,假设有 4 个分区,并且您创建了一个使用该主题的有状态处理器,那么您将获得 4 个任务,每个任务运行一个维护存储的一个分片的处理器实例。请注意,整体状态分为 4 个分片,每个分片基本上与其他分片隔离。

从处理器 API 运行时的角度来看,输入主题分区和状态存储分片(包括其相应的变更日志主题分区)是一个并行单元。因此,存储的变更日志主题是使用 4 个分区创建的,并且变更日志主题分区 X 映射到输入主题分区 X。请注意,Kafka Streams 在写入更改日志主题时使用基于哈希的分区,而是显式提供分区号,以确保处理输入主题分区的“处理器实例 X” X,仅从/写入changelog-topic-partition-X。

因此,如果您愿意,运行时与键无关。

如果您的输入主题没有按键分区,则具有相同键的消息将由不同的任务处理。根据程序的不同,这可能可以(例如过滤),也可以不可以(例如每个键的计数)。

与状态类似:您可以将任何 key 放入状态存储中,但该 key 对于相应分片来说是“本地”的。其他任务,永远不会看到这个键。因此,如果您在商店中的不同任务中使用相同的 key ,它们将完全彼此独立(就好像它们是两个 key 一样)。

使用处理器 API,您有责任正确分区输入数据并正确使用存储,具体取决于您需要的运算符语义。

在 DSL 级别,Kafka Streams 将确保数据正确分区,以确保正确的运算符语义。首先,假设输入主题按键分区。如果键被修改,例如通过 selectKey() 且下游运算符是聚合,Kafka Streams 将首先对数据进行重新分区,以确保具有相同键的记录位于同一主题分区中。这确保了每个 key 将在单个存储分片中使用。因此,DSL 始终会对数据进行分区,这样一个 key 就不会在不同的分片上处理。

关于apache-kafka - Kafka Streams 处理器 - 状态存储和输入主题分区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52744529/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com