Watermarks水位

刘超 17天前 ⋅ 244 阅读   编辑

目录

  1、Watermark是啥
  2、Watermark定义
  3、Watermark种类
    a、有序流中的watermark
    b、乱序流中的watermark
    c、单流多partition中的watermark
    d、多流中的watermark
  4、Watermark代价(完整性、延迟性)

 

一、Watermark是啥

  在实时系统中,由于各种原因造成某些消息发到flink的时间晚于事件产生时间。如果基于event time构建window,但是对于late element,我们又不能无限期的等下去,必须要有个机制来保证一个特定的时间后,必须触发window计算了。这个特别的机制,就是watermark。具体参考google的DataFlow。

二、Watermark定义

  1、watermarket是一种元素StreamElement,和普通数据一起在算子之间传递,它有个时间戳属性timestamp,标识了小于这个时间戳的事件已经到达了
  2、watermark水印在源位置发射,并通过拓扑中的运算符传播
  3、watermark触发窗口计算,那么Long.MAX_VALUE值会公诉算子后续没有任何数据了

三、Watermark种类

  1、有序流中的watermark

  在某些情况下,基于Event Time的数据流是有续的(相对event time)。在有序流中,watermark就是一个简单的周期性标记。

 

  2、乱序流中的watermark

  在更多场景下,基于Event Time的数据流是无续的(相对event time)。在无序流中,watermark至关重要,它告诉operator比watermark更早的事件已经到达, operator可以触发window计算啦

 

  3、单流多partition中的watermark

  多partition流入的watermark要min(input1,input2),如下

 

  4、多流中的watermark

  watermark通过广播传递且要保持单调递增,多流数据源流入的watermark要min(input1,input2),如下

 

四、Watermark代价(完整性、延迟性)

  有如下乱序事件

 

  为保证数据完整性,业务期望乱序的4也能参与[0,5)的分组计算中,8和9也能参与[5,10)的分组计算中,但这是有代价的,那就是我们需要等待,不能及时处理分组数据,而且依赖这个任务的后续所有任务都将延迟。

  有如下动画演示,横坐标是eventtime和纵坐标是processtime(事件处理时间),watermark是一个处理函数,这是两分钟的sum统计,左边的保证了数据完整性,同时也导致了12:02的计算在12:09才触发,造成了延迟;右边的是根据数据特点推理的,在一定程度上既考虑完整性又考虑了延时性,相比左边的,这个延时性小了一些,但是完整性也差了一些,比如12:00~12:02窗口,左边的是个14,但是右边的是5,所以没有最后的处理方式,只有更适合自己业务的处理方式