什么是 WaterMaker
WaterMaker 水位线在很多地方都有应用,
其含义也不尽相同,
在Flink中,水位线是用来触发窗口计算的
其本质相当于一个flink流中的一个 带时间戳的Event,
Flink在处理这个特殊 Event 的时候,
会认为该 Event携带的时间戳之前时间的所有数据都已经到了。
因此根据这个特性会触发相关窗口的计算逻辑。
WaterMaker有什么用
主要就是用来解决数据乱序问题
形象说明
- 假设我们现在是5s触发一个窗口计算
- 假设不加水印, 当 6s的事件到达,则会触发[0,5)的窗口计算
- 此时如果有 4s的事件来了,则该事件将不会被处理。
- 当我们加上延时2s的水位线,6s的事件来了, 6s的事件会被放在 [5,10)的窗口,
其计算的水位在6-2=4s
。此时Flink触发窗口的计算会依据 水位线来,
也就是说不会触发[0,5)的窗口。 - 此时如果再来一个 4s的事件,其依然会被正常加入到[0,5)的窗口,
但是水位线我们一般需要设置成递增,所以水位线应该还是在4s
而不是4-2=2s
- 当 7s的事件 到来,水位线变成
7-2=5s
,则Flink认为之后都不会再来 5s之前的数据了,
于是其就可以计算并关闭[0,5)的窗口。 - 所以我们可以看到,延时之后,4s的事件被正常处理了,
这就是水位线存在的意义。 - 但是水位线无法完全解决乱序问题,
其主要还是为了缓解乱序。
理论上,没有办法通过Flink做到完全解决乱序问题,
但是通过allowedLateness
和侧输出流
的方式
根据实际业务可以达到业务上面的完全顺序
WaterMaker的传递
因为Flink是分布式并行计算的,
所以水位的传递不是线性那么简单
这是一张官网的图,我们来解读一下加深理解。
- 首先图中的Task代表着Flink SubTask
也就是图中最大的方框 - 每个Task里面会为上游发送来的流准备一个分区
所以大方框的小方框代表的是每个分区里面的 WaterMaker,
也就是上游的waterMaker - 单个分区里面的WaterMaker是递增的,
接收到新的WaterMarker就会更新 - Task的WaterMarker 是该Taks所有分区最低的WaterMarker。
- 下游Task接受到的是上游Task的 WaterMarker广播出来的。
也就是上游Task所有分区中最低的WaterMarker - 所以看到第一个图,Task接受4个上游Task来的数据,
分别为他们存在四个分区里面 2 ,4 ,3 ,6,
而本身的 WaterMarker则是最低的 2。
其广播给下游的三个Task的 WaterMarker 都是2.
2,3,4图类似....
WaterMarker 实践
恩恩恩~~~~这部分就省略了....
随便翻翻都有一堆.....