Watermark中文翻译为“水位线”,在流计算中用得很多。如下图,是我在使用阿里实时计算平台代码中用到的Watermark水位线。(数据来源为阿里云日志服务)
CREATE TABLE log_submit (
aid VARCHAR,
bid VARCHAR,
log_time TIMESTAMP,
WATERMARK FOR log_time AS withOffset (log_time, 10000) --WaterMark为10秒
) WITH (
type = 'sls',
endPoint = 'xxxx',
roleArn = 'xxxx',
project = 'xxxx',
logStore = 'log_submit'
);
那么水位线WATERMARK究竟有什么作用?
假设一个流式框架,如果消息一个一个按顺序发送,代码中也按顺序依次处理,那么则没有任何问题。
但是,有些场景下,消息不是按顺序发送,产生乱序了,这个时候可以用水位线WATERMARK处理。
具体什么意思?
根据事件的event_time(上面代码中的log_time),计算出WATERMARKS,并设置一些延迟,给迟到的数据一些机会,即只等待迟到的数据一段时间。
举个🌰,假设设置10秒的滚动窗口函数,那么0~10s,10~20s都是一个窗口。以0~10s为例,0为start-time,10为end-time。假如有4个数据的event-time分别是8(A), 12.5(B), 9(C), 13.5(D),我们设置Watermarks为当前所有到达数据event-time的最大值减去延迟值3.5秒,也就是说对于迟到的数据,我们只等你3.5秒。
当A到达的时候,Watermarks为max{8}-3.5=8-3.5 = 4.5 < 10,不会触发计算
当B到达的时候,Watermarks为max(12.5,8)-3.5=12.5-3.5 = 9 < 10,不会触发计算
当C到达的时候,Watermarks为max(12.5,8,9)-3.5=12.5-3.5 = 9 < 10,不会触发计算
当D到达的时候,Watermarks为max(13.5,12.5,8,9)-3.5=13.5-3.5 = 10 = 10,触发计算
触发计算的时候,会将AC(因为他们都小于10)都计算进去
通过上面这种方式,我们就将迟到的C计算进去了。
这就是水位线的一个大概含义。