Flink WaterMark(水位线)分布式执行理解

背景

        WaterMark (水印) 本质上是一个时间戳。当Flink中的运算符接收到水印时,它明白(假设)它不会看到比该时间戳更早的消息。因此,在“EventTime”中,水印也可以被认为是一种告诉Flink它有多远的一种方式,WaterMark还可以用来实现时间延迟。

       本文主要涉及水印在单线程和分布式情况下的理解,基础知识和应用请看:Flink watermark 和 Flink编程框架

  

正文

       WaterMark相当于一个EndLine, 一旦WaterMark所携带的时间出现,就意味着windows_end_time时间和WaterMark时间相同的窗口开始计算执行了,WaterMark时间可以用现实时间,也可以用处理数据所携带的Event time,使用现实时间,在并行和多线程中需要注意的问题较少,因为都是以现实时间为标准,但是如果使用处理数据所携带的Event time作为WaterMark时间,需要注意两点:

          1.因为数据到达并不是循序的,注意保存一个当前最大时间戳作为WaterMark时间

          2. 并行同步问题

         以下内容将分为两部分,单线程版本和分布式多线程版本情况下,介绍WaterMark在系统中的使用和理解。

 

并行度为1的情况下 

         这里直接引用李麦迪博主的一篇文章:Flink流计算编程--watermark(水位线)简介

         但是要注意,虽然博主没有在示例代码将流程并行度设置为1,但是从Flink界面展示信息来看,博主运行流程的并行度为1,如下图所示。所以博主的实验中,认为WaterMark是一个全局值,实际在多并行度执行时,WaterMark会有多个值存在,且是不会自动同步的。

并行情况下

        假设流程设置并行度为2,则结构应如下所示,两个source,同时调用WaterMark生成代码,不断根据处理元素的Event Time生成WaterMark,流程中会有两种不同步的WaterMark标志流。
  

        如果此时有如下两个元素进入处理流程,并在代码中将WaterMark的timestamp打印出来的话,会是1536137355000和1536137349000两个不一样的WaterMark同时存在系统中。如果windows使用session windows, session gap 为3 seconds,理论上来说,Windows function应该被触发,但是,Windows并不会按照并行度为1时的设想调用apply处理方法,因为Windows总是以小的WaterMark为标准,windows同时收到两个并行source传过来的两个WaterMark标志,以1536137349000为标准,只认为1536137349000 WaterMark是有效的,1536137355000是无效的,因为只有一个并行处理的水印到达了1536137355000,另外一个并行度的水印还没到1536137355000。

key1,1536137349000
key1,1536137355000

       分析:如果流程中存在两个 WaterMark时间:1536137349000和1536137355000,窗口endtime时间为1536137349000,窗口会被触发吗?

        答案是不一定会,在多并行度的情况下,Windows总是以小的WaterMark时间为标准,所以当前窗口认为时间为1536137349000,所以窗口函数,不会被触发。

           那么何时会被触发呢?,当所有并行处理的1536137355000水印都到达之后,窗口函数才会被触发。

 

  • 4
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
Flink SQL中的水位线Watermark)是一种时间概念,主要用于处理流式数据的事件时间窗口计算。在Apache Flink这样的实时流处理框架中,由于数据的不可预测性和乱序到达,传统的基于点时间(point in time)的处理可能会导致结果不准确。水位线的概念引入了事件的时间依赖性,用于解决这个问题。 简单来说,水位线定义了一个“事件发生应该被处理”的时间范围。对于每个事件,系统会有一个与其关联的水位线,表示该事件发生后允许的最大延迟时间。如果后续的事件晚于这个水位线,那么就认为这些事件已经被处理过了;反之,如果新的事件早于水位线,系统则需要重新考虑之前的状态和计算。 Flink SQL的水位线设置涉及到两个关键参数: 1. **事件时间**(event time):这是相对于实际事件发生的绝对时间。 2. **滑动时间窗口**(sliding window):例如Tumbling Window或Sliding Window,用来定义事件何时进入和离开窗口。 - **事件时间戳**:每条消息都有其生成的时间戳,这是计算水位线的基础。 - **事件时间水印**:根据已接收的消息计算出来的未来可能到达的最新消息时间点。 - **处理时间水印**:基于消息实际到达时间计算的水位线Flink提供了API来调整水位线策略,如EventTimeSessionWindows中的timeBeforeEvent、timeAfterEvent等方法,用于设定水位线的具体行为。通过合理的水位线配置,Flink能够保证即使在数据乱序的情况下,也能正确地处理事件时间窗口内的数据
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值