请在 下方输入 要搜索的题目:

Flink的水位线watermark

Flink的水位线watermark

发布时间:2025-02-26 00:35:37
推荐参考答案 ( 由 快搜搜题库 官方老师解答 )
联系客服
答案:

Flink水印机制,简而言之,就是在Flink使用Event Time的情况下,窗口处理事件乱序和事件延迟的一种设计方案 

Flink根据时间的产生位置分为三种类型,事件时间(Event Time)、接入时间(Ingestion Time)、处理时间(Processing Time)。

d1c388415ed0f37a46d331d1a1bd9030

在实际应用中,一般会采用事件时间语义。而水位线,就是基于事件时间提出的概念。


在事件时间语义下,我们不依赖系统时间,而是基于数据自带的时间戳去定义了一个时钟,用来表示当前时间的进展。于是每个并行子任务都会有一个自己的逻辑时钟,它的前进是靠数据的时间戳来驱动的。


在 Flink 中,这种用来衡量事件时间(Event Time)进展的标记,就被称作“水位线”(Watermark)。


水位线可以看作一条特殊的数据记录,它是插入到数据流中的一个标记点,主要内容就是一个时间戳,用来指示当前的事件时间。而它插入流中的位置,就应该是在某个数据到来之后;这样就可以从这个数据中提取时间戳,作为当前水位线的时间戳了。

我们知道,在分布式系统中,数据在节点间传输,会因为网络传输延迟的不确定性,导致顺序发生改变,这就是所谓的“乱序数据”。 数据乱序是指Flink在使用Event Time处理流式数据时,由于分布式或网络原因,导致数据到达处理机制进行处理时并不是按照数据产生的时间先后顺序到达的 

b324b9f82f28ab9b363651b5c4215267

4.1 数据乱序场景的处理

Flink处理数据乱序的方式有三种:

1、Watermark

我们在设置watermark时,可以设置一个最大的乱序时间,而watermark是以事件时间减去所允许的最大乱序时间作为watermark,因此相当于多给了数据一定的时间,然后关闭窗口,触发计算。

为了让窗口能够正确收集到迟到的数据,我们也可以等上2秒;也就是用当前已有数据的最大时间戳减去2秒,就是要插入的水位线的时间戳,如下图所示。这样的话,9秒的数据到来之后,事件时钟不会直接推进到9秒,而是进展到了7秒;必须等到11秒的数据到来之后,事件时钟才会进展到9秒,这时迟到数据也都已收集齐,0~9秒的窗口就可以正确计算结果了。

a15e76dc9e6286a26a6a962a0cd636af

这里是等2秒,如果发现有的数据迟到时间超过2秒,那自然我们可以试着多等几秒,也就是把时钟调得更慢一些。最终的目的,就是要让窗口能够把所有迟到数据都收进来,得到正确的计算结果。对应到水位线上,其实就是要保证,当前时间已经进展到了这个时间戳,在这之后不可能再有迟到数据来了。 

2.允许迟到(allowedLateness)

如果在watermark的基础上有的数据还是可能会迟到,这时我们可以再多给数据一定的可以迟到的时间,此时当watermark到达窗口大小时触发计算,但是不会关闭窗口,而是直到所允许的迟到时间后,才会真正关闭窗口。

3、侧输出流

当数据迟到的时间非常久,前两种都失效时使用,相当于迟到数据归放入一个分支流中进行单独计算。




专业技术学习
专业技术学习
搜搜题库系统