使用流 API,我可以编写一个接受控制流和数据流的 RichCoFlatMapFunction,控制流包含用于开始或停止或更改计算参数的元素,我知道我可以将当前的控制设置存储在状态中,并在处理数据流时检查值。
但是用 Flink SQL 做类似事情的方法是什么呢? 我不能将加入用作数据流,并且控制流无法连接在一起。
我们想出的解决方案是按应用程序本身存储控制设置。 这个想法是:
-
将控制流广播到 map 运算符,并将控制设置存储到其 map() 方法中的 java 单例对象,因为映射运算符将以默认并行性运行,我们假设它将在该作业的所有 JVM 上运行,以便我们确保每个 JVM 都将初始化并不断更新单例对象中的控制设置。
-
使用 SQL,对于每个 UDAF 或 UDF,我们都可以通过访问 java 单例对象来访问控制设置。
但我不确定我的假设是否正确,这是一个可行的解决方案。
我认为这不是一个好主意。SQL不是为这样的用例而设计的。相反,SQL 查询将按指定进行优化和执行。无意更改查询的行为。除了设计角度之外,它的性能也不会很好,因为您需要对处理的每条记录执行分布式可查询状态的远程状态查找。这当然会增加延迟。
对我来说,您的用例听起来更像是一个应用程序,而不是SQL查询。为此,DataStream API将是正确的选择。您可以做的是将 SQL(或表 API)查询嵌入到应用程序中,即使用 SQL 进行预处理和后处理,并在中间有一个带有控制/数据流模式的运算符。