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

时间:2016-12-14 13:10:42

标签: apache-flink flink-streaming

在Flink中,我正在使用readTextFile读取文件并应用60毫秒的SlidingProcessingTimeWindows.of(Time.milliseconds(60), Time.milliseconds(60)),其上有60毫秒的幻灯片。在窗口流上,我正在计算元组的第二个字段的平均值。我的文本文件包含1100行,每行是元组(String,Integer)。我已将并行性设置为1并将消息键入元组的第一个字段。

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

1 个答案:

答案 0 :(得分:1)

AlpineGizmo评论中的答案是正确的。我将在这里添加更多细节。

Flink将时间窗口与时代的开头(1970-01-01-00:00:00)对齐。这意味着具有1小时窗口的窗口操作符会在每个新小时开始一个新窗口(即00:0001:0002:00,...)而不是第一个窗口到达记录。

根据系统的当前时间评估处理时间窗口。 如上面的注释中所述,这意味着可以处理的数据量取决于运营商运行的机器的处理资源(硬件,CPU / IO负载......)。因此,处理时间窗口不能产生可靠和一致的结果。

我的情况是,两种描述的效果都可能导致作业不一致的结果。根据您何时开始作业,数据将被分配到不同的窗口(如果第一个记录在第一个60 msecs窗口关闭之前到达,则只有该元素将在窗口中)。根据机器的IO负载,访问和读取文件可能需要更多或更少的时间。

如果您想获得一致的结果,则需要使用事件时间。在这种情况下,记录根据数据中编码的时间进行处理,即结果仅取决于数据,而不取决于外部效果,如作业的开始时间或加工机器的负载。 / p>