ApacheFlink-滑动处理时间窗口计算不一致的结果


0

在Flink中,我使用readTextFile和SlidingP读取一个文件正在处理TimeWindows.of(时间.毫秒(60人),时间.毫秒(60))60毫秒,滑动60毫秒。在窗口流上,我计算元组第二个字段的平均值。我的文本文件包含1100行,每行都是元组(String,Integer)。我已经将parallelism设置为1,并在tuple的第一个字段上 key入消息。

当我运行代码时,每次我得到不同的答案。我的意思是,有时它会读取整个文件,有时会先读取文件的某些行。它与滑动量的窗口大小有关系吗?如何找出这一关系,以确定窗口的大小和滑动量?

1 答案


0

AlpineGizmo评论中的答案是正确的。我在这里补充一些细节。

Flink将时间窗口与纪元的开始对齐(1970-01-01-00:00:00)。这意味着,具有1小时窗口的窗口操作员每隔一个新小时(即00:00、01:00、02:00…)启动一个新窗口,而不是使用第一个到达的记录。

处理时间窗口基于系统的当前时间进行计算。

在你的例子中,这两种效应都可能会导致结果不一致。 root据启动 job的时间,数据将被分配到不同的窗口(如果第一条记录在第一个60毫秒窗口关闭之前到达,则只有此元素将位于窗口中)。 root据机器的IO负载,访问和读取文件可能需要更多或更少的时间。

如果你想得到一致的结果,你需要使用事件时间。在这种情况下, root据在数据中编码的时间来处理记录,即结果仅取决于数据,而不取决于外部影响,例如 job的开始时间或处理机器的负载。


我来回答

写文章

提问题

面试题