在https://spark.apache.org/docs/latest/structured-streaming-programming-guide.html#handling-late-data-and-watermarking的文档中,使用10分钟的窗口,10分钟的水印和5分钟的触发器显示了一个示例。
在使用APPEND模式的图中,从12:00:00-> 12:10:00窗口显示的第一个结果仅显示在12:25:00。原因是那时水印在12:11:00,所以12:11:00之前的所有窗口都可以发送到接收器。
但是,在12:20:00,我们已经知道水印是12:11:00。那么,为什么不是在12:20:00而不是12:25:00发送第一个窗口?
答案 0 :(得分:1)
因为Spark对每个分区应用全局水印而不是水印:当当前批次中的任务“完成”时,将确定下一个批次的水印。每个分区都不知道要确定水印:它只知道分区中的事件。
因此,在12:20:00,Spark得到12:21:00进行处理,并且在批处理结束时,Spark收集事件的时间戳并确定最大时间戳,并为下一个批处理确定水印-“ 12 :11:00“-这将是一批12:25:00的水印。