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