赞
踩
|本文基于flink-1.9.3,其中官网 docs:
|flink-1.9 docs:Apache Flink 1.9 Documentation: Event Time
一个是数据产生的时间,我们把它叫作“事件时间”(Event Time);另一个是数据真正被处理的时刻,叫作“处理时间”(Processing Time)。我们所定义的窗口操作,到底是以哪种时间作为衡量标准,就是所谓的“时间语义”(Notions of Time)。由于分布式系统中网络传输的延迟和时钟漂移,处理时间相对事件发生的时间会有所滞后。
一个是数据产生的时间,我们把它叫作“事件时间”(Event Time);
另一个是数据真正被处理的时刻,叫作“处理时间”(Processing Time);
事件时间中,使用数据自带的时间戳定义一个时钟来表示当前时间的进展。每个子任务都有自己的时钟,由数据的时间戳推动。
但在分布式系统中,这可能引发问题。特别是在执行窗口聚合等操作时,数据减少,时钟控制变得不够精细。此外,数据只能传递给下游任务的一个子任务,导致其他子任务的时钟停滞。例如,如果一个时间戳为9点的数据到达,当前任务的时钟已经是9点;处理后,将数据发送到下游,如果下游任务是窗口计算,且并行度为3,那么接收到数据的子任务的时钟也会是9点,可以关闭9点结束的窗口进行计算,而其他两个子任务的时钟则没有改变,无法进行窗口计算。
因此,需要将时钟以数据的形式传递给下游任务,告知它们当前事件时间的进展。这种标记被称为“水位线”(Watermark)。水位线是一种特殊的数据记录,插入到数据流中,包含一个时间戳,用于指示当前事件时间。它应在某个数据到达后插入数据流中,以便从该数据中提取时间戳,并用作当前水位线的时间戳。
水位线的默认计算公式:水位线 = 观察到的最大事件时间
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。