Structured Streaming和flink都支持流式操作,支持对乱序数据的处理,都引入了watermark的概念,watermark都是系统能处理的乱序数据的最早的时间,但二者的具体表现也不尽相同。
1、Structured Streaming的watermark机制
-
(a+) 在对 event time 做 window() + groupBy().aggregation() 即利用状态做跨执行批次的聚合,并且
-
(b+) 输出模式为 Append 模式或 Update 模式
时,Structured Streaming 将依靠 watermark 机制来限制状态存储的无限增长、并(对 Append 模式)尽早输出不再变更的结果。
如果既不是 Append 也不是 Update 模式,或者是 Append 或 Update 模式、但不需状态做跨执行批次的聚合时,则不需要启用 watermark 机制。
watermark的更新
1)spark任务执行以集群时间为准,window操作处理当前时间段(与event time无关)收到的数据,如图中每隔5min进行一次window操作,window的长度是10min。
2)watermark在每个window操作进行时更新,为当前收到的最大的event time-允许的延迟时间,如:图中12:15的batc