Spark 结构化流在追加模式下显示结果太迟
Spark structured streaming shows results too late when in append mode
在 https://spark.apache.org/docs/latest/structured-streaming-programming-guide.html#handling-late-data-and-watermarking 的文档中,显示了一个使用 10 分钟的 window、10 分钟的水印和 5 分钟的触发器的示例。
在使用 APPEND 模式的图表中,12:00:00->12:10:00 window 的第一个结果仅显示在 12:25:00。原因是当时水印在12:11:00所以12:11:00之前的所有windows已经可以发送到sink了。
然而,在 12:20:00,我们已经知道水印是 12:11:00。那么为什么第一个 window 不是在 12:20:00 而不是 12:25:00 发送呢?
因为 Spark 为每个分区应用全局水印而不是水印:当当前批次 "finishes" 中的任务时决定下一批次的水印。每个分区都不知道决定水印:它只知道它分区中的事件。
所以在 12:20:00,Spark 得到 12:21:00 并处理它,在批处理结束时,Spark 收集事件的时间戳并确定最大时间戳,并决定下一批的水印 - “12:11:00” - 这将是批处理 12:25:00.
的水印
在 https://spark.apache.org/docs/latest/structured-streaming-programming-guide.html#handling-late-data-and-watermarking 的文档中,显示了一个使用 10 分钟的 window、10 分钟的水印和 5 分钟的触发器的示例。
在使用 APPEND 模式的图表中,12:00:00->12:10:00 window 的第一个结果仅显示在 12:25:00。原因是当时水印在12:11:00所以12:11:00之前的所有windows已经可以发送到sink了。
然而,在 12:20:00,我们已经知道水印是 12:11:00。那么为什么第一个 window 不是在 12:20:00 而不是 12:25:00 发送呢?
因为 Spark 为每个分区应用全局水印而不是水印:当当前批次 "finishes" 中的任务时决定下一批次的水印。每个分区都不知道决定水印:它只知道它分区中的事件。
所以在 12:20:00,Spark 得到 12:21:00 并处理它,在批处理结束时,Spark 收集事件的时间戳并确定最大时间戳,并决定下一批的水印 - “12:11:00” - 这将是批处理 12:25:00.
的水印