【问题标题】:Control stream in Flink SQLFlink SQL 中的控制流
【发布时间】:2018-09-01 17:13:55
【问题描述】:

使用流 API,我可以编写一个 RichCoFlatMapFunction 接受控制流和数据流,控制流包含用于启动或停止或更改计算参数的元素,我知道我可以将当​​前控制设置存储在状态,并在处理数据流时检查值。

但是用 Flink SQL 做类似事情的方法是什么? 我无法将 join 用作数据流,并且控制流无法连接在一起。

我们提出的解决方案是通过应用程序本身存储控制设置。 这个想法是:

  1. 将控制流广播到 map 操作符,并将控制设置存储到其 map() 方法中的 java 单例对象中,因为 map 操作符将以默认并行度运行, 我们假设它将在该作业的所有 JVM 上运行,因此我们确保每个 JVM 都会初始化并不断更新单例对象中的控制设置。

  2. 使用 SQL,对于每个 UDAF 或 UDF,我们可以通过访问 java 单例对象来访问控制设置。

但我不确定我的假设是否正确,这是一个可行的解决方案。

【问题讨论】:

    标签: apache-flink flink-streaming flink-sql


    【解决方案1】:

    我认为这不是一个好主意。 SQL 不是为此类用例而设计的。而是按指定优化和执行 SQL 查询。不打算更改查询的行为。除了设计角度之外,它也不会表现良好,因为您需要对您处理的每条记录进行远程状态查找以分布式可查询状态。这当然会增加延迟。

    对我来说,您的用例听起来更像是一个应用程序,而不是 SQL 查询。为此,DataStream API 将是正确的选择。您可以做的是将 SQL(或 Table API)查询嵌入到应用程序中,即使用 SQL 进行预处理和后处理,并在中间有一个带有控制/数据流模式的运算符。

    【讨论】:

    • 明白你的意思,但我不明白为什么它会增加延迟。即使使用 DataStream API,我们仍然必须从数据流中的每条记录的状态中获取当前控制设置。而且我们不需要远程查找,因为每个 JVM 都会有一个集群单例对象用于本地查询。
    • 我想过混合DataStreamp API和SQL,但看起来并不容易,我的要求是当我们收到来自控制流的停止消息时,我们停止包括预处理在内的一切,所以我们需要找到一种方法将控制流通知给 SQL 部分,除非我们根本不使用 SQL。
    • 单身人士通常不是一个好主意。您依赖于在同一个 JVM 上执行两个不同的操作这一事实。 IMO,这种设计行不通。关于混合 API,您可以在第一个 SQL 查询之前将过滤器作为第一个运算符。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多