gpt4 book ai didi

java - Kafka KTable——跨机器共享聚合

转载 作者:搜寻专家 更新时间:2023-11-01 01:32:15 24 4
gpt4 key购买 nike

假设我有一个包含多个分区的主题。我在其中写入 K/V 数据,并希望通过按键在 Tumbling Windows 中聚合所述数据。

假设我已经启动了与我有分区一样多的工作实例,并且每个工作实例都在单独的机器上运行。

我将如何确保生成的聚合包含每个键的所有值? IE 我不希望每个 worker 实例都有一些值的子集。

这是 StateStore 的用途吗? Kafka 是自己管理这个还是我需要想出一个方法?

最佳答案

How would I go about insuring that the resultant aggregations include all values for each key? IE I don't want each worker instance to have some subset of the values.

通常,Kafka Streams 确保同一个键的所有值将由同一个(且只有一个)流任务处理,这也意味着只有一个应用程序实例(您描述为“工作实例”)将处理该键的值。请注意,一个应用实例可能会运行 1 个以上的流任务,但这些任务是隔离的。

这种行为是通过数据的分区实现的,Kafka Streams 确保一个分区总是由同一个流任务处理。键/值的逻辑链接是,在 Kafka 和 Kafka Streams 中,一个键总是被发送到同一个分区(这里有一个陷阱,但我不确定是否有必要详细了解范围这个问题),因此一个特定的分区——在可能的许多分区中——包含同一个键​​的所有值。

在某些情况下,例如加入两个流 AB 时,您必须确保聚合将对相同的键进行操作,以确保来自两个流的数据流位于同一个流任务中——同样,这都是为了确保相关的输入流分区,从而匹配键(来自 AB ,分别)在同一个流任务中可用。您在这里使用的典型方法是 selectKey()。一旦完成,Kafka Streams 确保,为了连接两个流 A 和 B 以及创建连接的输出流,相同键的所有值将由相同的流任务处理,从而由相同的应用程序实例处理。

例子:

  • A 具有键 userId 和值 { georegion }
  • B 具有键 georegion,值为 { continent, description }

仅当两个流使用相同的 key 时,加入两个流才有效(从 Kafka 0.10.0 开始)。在此示例中,这意味着您必须重新键入(并因此重新分区)流 A,以便生成的键从 userId 更改为 georegion。否则,从 Kafka 0.10 开始,您无法连接 AB,因为数据没有位于负责实际执行连接的流任务中。

在此示例中,您可以通过以下方式对流 A 进行重新加密/重新分区:

// Kafka 0.10.0.x (latest stable release as of Sep 2016)
A.map((userId, georegion) -> KeyValue.pair(georegion, userId)).through("rekeyed-topic")

// Upcoming versions of Kafka (not released yet)
A.map((userId, georegion) -> KeyValue.pair(georegion, userId))

只有在 Kafka 0.10.0 中才需要 through() 调用来实际触发重新分区,而更高版本的 Kafka 会自动为您完成这些(即将推出的功能已经完成并可用)在 Kafka trunk 中)。

Is this something that a StateStore would be used for? Does Kafka manage this on its own or do I need to come up with a method?

一般来说,不会。上述行为是通过分区实现的,而不是通过状态存储。

有时,由于您为流定义的操作而涉及状态存储,这可能解释了您问这个问题的原因。例如,窗口操作需要管理状态,因此将在幕后创建状态存储。但是您的实际问题——“确保生成的聚合包括每个键的所有值”——与状态存储无关,它与分区行为有关。

关于java - Kafka KTable——跨机器共享聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39256483/

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