一般情况下, Watermark 是 source task 产生,不是source task也是靠近source task的map或reduce等算子产生的, 然后通过 keyby 分组后触发窗口计算。
注意keyby只是一个分配的过程而不是一个算子, 只有开窗之后的窗口方法才是真正的计算
以下内容借鉴了如下作者部分内容
作者:熊本极客
链接:https://www.jianshu.com/p/66923b0ab4a8
来源:简书
先放上结论, 然后再结合下面图示理解
① Watermark 要单调递增。② Watermark在keyby之后的window操作之后取最小值向后传递。
如下图是刚开始产生了两个watermark 一个是时间为1 一个时间为 2, 正在向map传递
接着下图watermark到map了 正在向window传递, 因为经过了keyby所以, watermark要每个window都传递一份, 同时source有生成了一个time为4, 一个time为1的 watermark
之后第一批watermark会到达window, 比如先到的是watermark time=1, 那么它会在window中保存
并且等待新的watermark到来, 才会继续向后传递watermark.
window中watermark的状态就像这样
接着 watermark time=2 到了, 那么window就会向后面发送 time=1 的那个water mark
window中watermark的状态就像这样
之后第二批的water mark到了, 第三批的也生成了
比如, watermark time=5 先到window, 那么window中就像这样
这个时候就会将较小的 watermark time=2 传递到后面, 同理当watermark time=4到来的时候, 经过比较会将 time=4传递到后面
最后, 看看第三批watermark到了 window
假如, watermark time=3先到的 window中 会出现什么状况呢?
因为window中目前最小的就是time =4 了, 所以time=3来了并不会增加, 所以也不会替换任何watermark也不会向下传递