滑动处理时间window计算出不一致的结果
Sliding processing time window computes inconsistent results
在 Flink 中,我正在使用 readTextFile
读取一个文件,并在其上应用 60 毫秒的 SlidingProcessingTimeWindows.of(Time.milliseconds(60), Time.milliseconds(60))
和 60 毫秒的幻灯片。在 windowed 流上,我正在计算元组第二个字段的平均值。我的文本文件包含 1100 行,每行都是元组(字符串,整数)。我已将并行度设置为 1 并将消息键入元组的第一个字段。
当我运行代码时,每次我得到不同的答案。我的意思是看起来,有时它会读取整个文件,有时它会先读取文件的某些行。跟滑动量的大小window有关系吗?怎么找出这个关系来决定window的大小和滑动量呢?
AlpineGizmo评论中的答案是正确的。我将在此处添加更多详细信息。
Flink 将时间 windows 对齐到纪元的开始 (1970-01-01-00:00:00
)。这意味着具有 1 小时 window 的 window 运算符在每个新的小时开始一个新的 window(即,在 00:00
、01:00
、02:00
, ...) 而不是第一个到达的记录。
处理时间windows根据系统当前时间计算。
正如上面评论中所说,这意味着可以处理的数据量取决于操作员运行的机器的处理资源(硬件,CPU/IO 负载,...)。因此,处理时间 window 无法产生可靠且一致的结果。
就您的情况而言,所描述的两种影响都可能导致跨作业的结果不一致。根据你开始作业的时间,数据将被分配到不同的windows(如果第一条记录在第一个60毫秒window关闭之前到达,只有这个元素会在window).根据机器的 IO 负载,访问和读取文件可能需要更多或更少的时间。
如果你想得到一致的结果,你需要使用事件时间。在这种情况下,记录是根据编码在数据中的时间进行处理的,即结果仅取决于数据,而不取决于工作的开始时间或处理机器的负载等外部影响。
在 Flink 中,我正在使用 readTextFile
读取一个文件,并在其上应用 60 毫秒的 SlidingProcessingTimeWindows.of(Time.milliseconds(60), Time.milliseconds(60))
和 60 毫秒的幻灯片。在 windowed 流上,我正在计算元组第二个字段的平均值。我的文本文件包含 1100 行,每行都是元组(字符串,整数)。我已将并行度设置为 1 并将消息键入元组的第一个字段。
当我运行代码时,每次我得到不同的答案。我的意思是看起来,有时它会读取整个文件,有时它会先读取文件的某些行。跟滑动量的大小window有关系吗?怎么找出这个关系来决定window的大小和滑动量呢?
AlpineGizmo评论中的答案是正确的。我将在此处添加更多详细信息。
Flink 将时间 windows 对齐到纪元的开始 (1970-01-01-00:00:00
)。这意味着具有 1 小时 window 的 window 运算符在每个新的小时开始一个新的 window(即,在 00:00
、01:00
、02:00
, ...) 而不是第一个到达的记录。
处理时间windows根据系统当前时间计算。 正如上面评论中所说,这意味着可以处理的数据量取决于操作员运行的机器的处理资源(硬件,CPU/IO 负载,...)。因此,处理时间 window 无法产生可靠且一致的结果。
就您的情况而言,所描述的两种影响都可能导致跨作业的结果不一致。根据你开始作业的时间,数据将被分配到不同的windows(如果第一条记录在第一个60毫秒window关闭之前到达,只有这个元素会在window).根据机器的 IO 负载,访问和读取文件可能需要更多或更少的时间。
如果你想得到一致的结果,你需要使用事件时间。在这种情况下,记录是根据编码在数据中的时间进行处理的,即结果仅取决于数据,而不取决于工作的开始时间或处理机器的负载等外部影响。