在Flink中,我正在使用readTextFile
读取文件,并在其上涂上60毫秒的SlidingProcessingTimeWindows.of(Time.milliseconds(60), Time.milliseconds(60))
,其幻灯片为60毫秒。在窗口流上,我正在计算元组提交的第二个均值的平均值。我的文本文件包含1100行,每行都是元组(字符串,整数)。我将并行性设置为1,并在元组的第一字段上键入消息。
运行代码时,每次我得到不同的答案。我的意思是,似乎有时会读取整个文件,有时它会在文件的一些行中读取一条线。它与窗口大小的滑动量有一定的关系吗?如何找到这种关系,以便我可以决定窗口的大小和滑动量?
alpinegizmo评论中的答案是正确的。我将在这里添加更多详细信息。
Flink将时间窗口对齐到时代的开始(1970-01-01-00:00:00
)。这意味着一个带有1小时窗口的窗口操作员每小时都会启动一个新窗口(即在00:00
,01:00
,02:00
,...),而不是首次到达记录。
根据系统的当前时间评估处理时间窗口。如上所述,这意味着可以处理的数据量取决于操作员运行的机器的处理资源(硬件,CPU/IO负载,...)。因此,处理时间窗口无法产生可靠且一致的结果。
i您的情况,两种描述的效果可能会导致结果不一致。根据您启动作业的不同,数据将被分配给其他窗口(如果第一个记录在关闭了第一个60毫秒之前到达,则只有此元素在窗口中)。根据计算机的IO负载,可能需要花费更多的时间访问和读取文件。
如果您想获得一致的结果,则需要使用事件时间。在这种情况下,记录是根据数据中编码的时间进行处理的,即结果仅取决于数据,而不取决于外部效果,例如作业的起始时间或处理机的负载。<<<<