首页 > 解决方案 > Spark Structured Streaming - 即使没有输入行也强制执行微批处理

问题描述

我们有一个 Spark Structured Streaming 查询,它计算过去一小时收到的输入行数,每分钟更新一次,使用时间窗口 ( windowDuration="1 hour", slideDuration="1 minute") 执行聚合。查询配置为使用 processingTime 触发器,持续时间为 30 secods trigger(processingTime="30 seconds")。的outputMode查询是append

只要接收到新行,此查询就会产生结果,这与文档为固定间隔微批次指示的行为一致:

如果没有新数据可用,则不会启动微批处理。

但是,即使没有输入行,我们也希望查询产生结果:我们的用例与监控相关,并且我们希望在监控系统中一段时间​​内没有输入消息时触发警报。

例如,对于以下输入:

事件时间 event_id
00:02 1
00:05 2
01:00 3
03:00 4

在 processingTime=01:01,我们可以假设将产生以下输出行:

窗口.start 窗口.end 数数
00:00 01:00 3

但是,从这一点开始,直到 03:00 之前都没有输入行,因此,直到此时才会执行任何微批处理,从而错过了生成输出行的机会,例如:

窗口.start 窗口.end 数数
01:01 02:01 0

否则会在我们的系统中产生监控警报。

这种行为是否有任何解决方法,允许在没有输入行时执行空微批处理?

标签: apache-sparkspark-structured-streaming

解决方案


你不能要求软件中没有提供的东西,也没有变通办法。甚至有一段时间,可能仍然存在,其中最后一组微批量数据没有被处理。


推荐阅读