Kafka Stream-TimeWindows

时间:2018-12-13 08:01:17

标签: apache-kafka apache-kafka-streams

我对使用Kafka Streams的TimeWindows有疑问,有些概念确实使我感到困惑。

我们有一个主题,该主题每天会产生1000万个事件,并且日志保留时间为6天,因此该主题总共包含6000万个事件。

实际上,只有当日的事件对我们来说很有趣,其余的事件仅保留5天是出于审计的原因。

现在,我从中创建了一个KTable,我正在执行所有操作的加载并遍历事件。正如我之前提到的,实际上我们只关注当天的事件,而不关注6000万个事件,因此我在KTable定义中对数据进行了窗口化。

.windowedBy(TimeWindows.of(TimeUnit.DAYS.toMillis(1)).until(TimeUnit.DAYS.toMillis(1))

现在,当我使用以下语句加载所有事件时,一切运行正常。

store().fetchAll(System.currentTimeMillis() - TimeUnit.DAYS.toMillis(1), System.currentTimeMillis())

这个问题虽然很早,但可以加载100万个事件,但后来又增加了1000万个,因此在批处理模式下,我必须迭代超过1000万个事件,我认为我可以进一步优化它并且只加载过去一小时的事件,因此对于相同的KTable配置,我尝试使用以下语句。

store().fetchAll(System.currentTimeMillis() - TimeUnit.HOURS.toMillis(1), System.currentTimeMillis())

但是令我惊讶的是,它没有返回任何数据。

有人可以解释为什么它不返回任何结果,我想我是在解释TimeWindow概念中的某些内容。

然后,我做了一些进一步的测试,并将我的KTable配置更改为以下内容。

.windowedBy(TimeWindows.of(TimeUnit.HOURS.toMillis(1)).until(TimeUnit.DAYS.toMillis(1)))

现在此查询功能如我所愿

store().fetchAll(System.currentTimeMillis() - TimeUnit.HOURS.toMillis(1), System.currentTimeMillis())

但我不确定我走的路是否正确...

如果我将以下语句用于最新的KTable配置,那么从今天开始,这将为我带来1000万个事件吗?

store().fetchAll(System.currentTimeMillis() - TimeUnit.DAYS.toMillis(1), System.currentTimeMillis())

1 个答案:

答案 0 :(得分:0)

在窗口商店中使用交互式查询时,时间范围将应用于窗口开始时间戳。因此,如果您有一个为期1天的窗口,并且从[now - 1 hour, now)开始查询具有窗口开始时间戳记的数据,则将找不到任何匹配的窗口,因为在该时间范围内没有窗口开始。