Kafka Streams - 跳跃窗口 - 重复数据删除键

时间:2017-05-04 00:19:52

标签: apache-kafka apache-kafka-streams

我正在一个4小时的窗口进行跳跃窗口聚合,每5分钟推进一次。由于跳跃窗口重叠,我得到具有不同聚合值的重复键。

TimeWindows.of(240 * 60 * 1000L).advanceBy(5 * 60* 1000L)

如何使用重复数据消除重复键或仅选择包含最新值的键。

3 个答案:

答案 0 :(得分:8)

如果我理解正确,那么这是预期的行为。您没有看到“重复”键,但您看到同一个键的连续更新。

想:

# Extreme case: record caches disabled (size set to 0)
alice->1, alice->2, alice->3, alice->4, ..., alice->100, ...

# With record cache enabled, you would see sth like this.
alice->23, alice->59, alice->100, ...

看一下http://docs.confluent.io/current/streams/developer-guide.html#streams-developer-guide-memory-management的解释,更详细地描述了这一点。如果您希望每个记录键看到更少的“重复”,则可以通过应用程序配置中的cache.max.bytes.buffering又名StreamsConfig.CACHE_MAX_BYTES_BUFFERING_CONFIG来增加记录缓存(使用DSL时)的大小。还有commit.interval.ms的相互作用。

如果您想知道“为什么Kafka Streams API首先以这种方式运行”,我建议本周早些时候发布的博客文章https://www.confluent.io/blog/watermarks-tables-event-time-dataflow-model/

答案 1 :(得分:7)

除了迈克尔写的东西外,在跳窗中还有另一层“复制”。由于窗口重叠,因此后续窗口发出的值可能相同。 例如,假设您有一个五分钟的窗口,跳了一分钟:{0..5},{1..6},{2..7},依此类推。输入主题的给定记录可能属于不同的时间窗口。

这与滚动窗口相反,在滚动窗口中,窗口不重叠,因此每个记录都是单个窗口的一部分。不幸的是,滚动窗口并不适合所有用例。一个示例可以是聚合,其中具有相同键的两个记录位于两个后续窗口的边缘。

使用跳跃窗口时,有几种方法可以“重复数据删除”。一种方法是“降级”下游。另一种方法是在Kafka Streams中执行此操作,但这仅与特定拓扑有关。如所解释的,这些结果不是真实的重复项,而是连续窗口的结果。如果只需要某个键的最后一个窗口的结果,则可以编写如下内容:

windowedKtable
.toStream((windowedKey, value) -> windowedKey.key())
.groupByKey()
.reduce((value1, value2) -> value1.lastestActivity() > value2.lastestActivity() ? value1 : value2)

我不会说这是最佳实践,只是在非常特殊的情况下解决问题的一种方法。

有关Kafka Streams中窗口化的更多信息: https://docs.confluent.io/current/streams/developer-guide/dsl-api.html#windowing

答案 2 :(得分:0)

使用跳跃窗口时,一个键同时存在多个时间窗口。生成新日志时,聚合将同时更改这些时间窗口的状态,因此,在应用<ul> <li *ngFor="let course of courses$ | async"> {{ course }} </li> </ul> 时,将产生重复数据删除日志到下游主题。

要获取最新时间窗口的结果,必须提供InvalidPipeArgument for pipe 'AsyncPipe'来过滤最新时间窗口更改日志,这是一个示例,描述了如何在使用跳跃窗口时获取最新的窗口聚合结果。

hopping window aggregation with latest window result