含义
事件时间:数据产生的时间
处理时间:数据的处理时刻
水位线
用来衡量事件时间进展的标记,就被称作『水位线』,水位线可以看作是一条特殊的数据记录,是插入到数据流中的一个标记点,主要内容是个时间戳,标记事件时间。
虽然水位线代表着数据事件时间,但是数据可能乱序到达,如何处理乱序的水位线,在
乱序+数据量小:判断数据当前时间是否大于当前水位线,大于则更新水位线。
乱序+数据量大:每过一段找到这段时间最大的时间戳,判断与当前水位线关系,大则更新
乱序+迟到的数据:为了让窗口窗口收集到迟到的数据,采用等待窗口。
水位线特性:
- 水位线是插入到数据流中的一个标记,可以认为是一个特殊的数据
- 水位线主要的内容是一个时间戳,表示当前事件时间的进展
- 水位线是基于数据的时间戳生成的
- 水位线的时间戳必须单调递增,以确保任务的事件时间一直向前推进
flink中可以将数据流切割成有限大小的多个存储桶(存储桶),会把每个数据分发到对应的桶中,每个数据都会分发到对应的桶,当到达窗口结束时间时,就对每个桶中收集的数据进行计算处理。
生成水位线
完美的水位线是绝对正确的,是指等足够的时间,保证水位线之前的数据全部到齐,但是为实时性,没有办法让水位线等的足够长,对于低延迟和结果的正确需要权衡机制
指定watermark 策略,然后使用时间窗口时应该使用事件时间的窗口。
watermark主要有两类一类是有序的,一类是乱序的(其实,本质上有序的就是乱序容忍度为0的乱序)
有序流:watermark = 最大事件时间
无序流:watermark= 最大事件时间 - 乱序容忍度
多并行度下水位线传递
在多个算子下,数据的处理速度不同,在流式计算中,不同算子处理的进度是不同的,在watermark进度传递时候,按照最小原则进行传递。多个并行度下只有算子的每个处理进度到达触发。
特殊情况下,可能由于某个并行度某个并行度下一直没有数据,会导致窗口一直不触发,针对这种清库,可以为并行度设置空闲等待。
迟到数据处理
针对迟到的数据可以设置数据允许迟到,保证对于迟到的数据也能进行处理,通过 allowedLateness 推迟关闭窗口,窗口主要有两步:1是触发窗口计算,2是窗口关闭:乱序容忍度针对触发窗口计算时间的推迟;推迟关闭窗口则是针对窗口关闭,在推迟窗口关闭这块则是来一条则需要重新计算一次窗口。
迟到数据可以通过侧数据流进行处理
因为实时流式处理,不会一直等待数据,但是可以通过辅助的侧流的数据进行处理。