在前面的流处理随谈一文中已经简单介绍了Watermark,本文主要再结合Flink具体分析一下,作为补充。
理论
如果看完之前的文章,已经完全理解了Watermark,那可以直接跳过这部分,看实战部分。如果还不太理解,我通过几个问题来阐述一下,帮助你理解。要注意的是下面的描述方式和实际实现未必完全一样(有些甚至是我的个人观点),但可以帮助你更好的理解。
What?
Watermark是什么?从不同的维度可以有不同的理解
- 从Watermark的计算角度看:可以将Watermark理解为一个函数:F(P)−>EF(P)−>E,它的输入是当前的系统时间,输出是一个Event Time(一个时间戳),而且输出的这个时间戳是严格单调递增的。这样看,Watermark就是一个函数。
- 从Watermark的具体形式来看:可以将Watermark当成一个个时间戳,值就是1中输出的那个时间戳。
- 从Watermark流转的角度看:可以将Watermark理解成夹杂在正常流事件中的一个个特殊事件。
这3种描述方式,看似不同,实则一样,只是从不同的角度去看了而已。不管怎么理解,我们必须知道:流处理系统规定,如果某个时刻Watermark的值为T1,那系统就认为凡是早于或等于T1时间的事件都已经收到了。注意,这个就是Watermark所代表的含义,