Flink WaterMaker详解

什么是 WaterMaker

WaterMaker 水位线在很多地方都有应用,
其含义也不尽相同,
在Flink中,水位线是用来触发窗口计算的
其本质相当于一个flink流中的一个 带时间戳的Event
Flink在处理这个特殊 Event 的时候,
会认为该 Event携带的时间戳之前时间的所有数据都已经到了。
因此根据这个特性会触发相关窗口的计算逻辑。

WaterMaker有什么用

主要就是用来解决数据乱序问题

形象说明

  1. 假设我们现在是5s触发一个窗口计算
  2. 假设不加水印, 当 6s的事件到达,则会触发[0,5)的窗口计算
  3. 此时如果有 4s的事件来了,则该事件将不会被处理。
  4. 当我们加上延时2s的水位线,6s的事件来了, 6s的事件会被放在 [5,10)的窗口,
    其计算的水位在 6-2=4s。此时Flink触发窗口的计算会依据 水位线来,
    也就是说不会触发[0,5)的窗口。
  5. 此时如果再来一个 4s的事件,其依然会被正常加入到[0,5)的窗口,
    但是水位线我们一般需要设置成递增,所以水位线应该还是在4s而不是 4-2=2s
  6. 当 7s的事件 到来,水位线变成7-2=5s,则Flink认为之后都不会再来 5s之前的数据了,
    于是其就可以计算并关闭[0,5)的窗口。
  7. 所以我们可以看到,延时之后,4s的事件被正常处理了,
    这就是水位线存在的意义。
  8. 但是水位线无法完全解决乱序问题,
    其主要还是为了缓解乱序。
    理论上,没有办法通过Flink做到完全解决乱序问题,
    但是通过 allowedLateness侧输出流 的方式
    根据实际业务可以达到业务上面的完全顺序

WaterMaker的传递

因为Flink是分布式并行计算的,
所以水位的传递不是线性那么简单

Flink WaterMaker详解_第1张图片
image.png

这是一张官网的图,我们来解读一下加深理解。

  1. 首先图中的Task代表着Flink SubTask
    也就是图中最大的方框
  2. 每个Task里面会为上游发送来的流准备一个分区
    所以大方框的小方框代表的是每个分区里面的 WaterMaker,
    也就是上游的waterMaker
  3. 单个分区里面的WaterMaker是递增的,
    接收到新的WaterMarker就会更新
  4. Task的WaterMarker 是该Taks所有分区最低的WaterMarker。
  5. 下游Task接受到的是上游Task的 WaterMarker广播出来的。
    也就是上游Task所有分区中最低的WaterMarker
  6. 所以看到第一个图,Task接受4个上游Task来的数据,
    分别为他们存在四个分区里面 2 ,4 ,3 ,6,
    而本身的 WaterMarker则是最低的 2。
    其广播给下游的三个Task的 WaterMarker 都是2.
    2,3,4图类似....

WaterMarker 实践

恩恩恩~~~~这部分就省略了....
随便翻翻都有一堆.....

你可能感兴趣的:(分布式,flink,python,java,数据分析)