Flink关系型API

image.png

Flink各种层次的API,在成本和易用性之间权衡。应用可以自行搭配API。

一句话介绍Flink SQL

符合标准 SQL的 服务,可查询静态和流数据,它利用了Apache Flink的性能、可扩展性和一致性

对静态表快照的一次性查询

image.png
image.png
注意发起查询后,新加的数据不在统计范围内。

SQL 的语义

  • 标准 SQL 语义
    • Table随时间变化
    • 针对表的静态快照运行查询
    • 查询输入是有限的,结果也是有限的和确定的

对动态表的连续查询

image.png
image.png
image.png
此时的结果与一次性查询相同。

streaming SQL的语义

  • Streaming SQL

    • 输入表正在变化并且可能是无限的
    • 查询结果永远不会是最终的、不断更新的,并且可能是无限的
    • 查询的语义是相同的,无论是在表快照上执行一次,还是在变化的表上连续执行

      批流统一

  • 可用性

    • ANSI SQL语法:没有自定义的”StreamSQL”语法
    • ANSI SQL语义:没有stream-specific的结果语义
  • 可移植性
    • 对有界或无界数据运行相同的查询
    • 对被记录下来的或实时数据运行相同的查询
    • 从历史数据引导查询状态或回填结果

image.png

查询是并行执行的

  1. INSERT INTO sink
  2. SELECT user, COUNT(URL) as cnt
  3. FROM clicks
  4. GROUP BY user

image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png

  • 每个查询都编译成一个 Flink 作业
    • 数据流经有向无环图,叫做Job Graph
  • GROUP BY触发网络shuffle
    • 将具有相同分组key(例如user)的每个事件带到同一个实例
  • 聚合需要(容错)状态
    • 这不是整个“动态表”的物化视图
    • 而只是计算结果所需的最小值

动态表描述了一个逻辑概念。我们实际上并没有将整个表存储在状态中,而是仅存储计算所需结果所必需的。稍后我们将看到如何利用时间约束来避免保持不再影响结果的状态。

例如,当按照一小时的基于时间的窗口聚合时,一旦我们完成了从 10 点到 11 点之间的数据处理并发出了它的结果,我们就不再需要保留有关该小时的任何信息。我们已经(或相信我们已经)处理了所有可能影响这些结果的事件,并且这些结果是最终的。

关于时间

  • 在许多连续查询中,适当的时间处理非常重要
    • 对时间相关的行进行Group或join
    • 语义与在快照上运行查询相同
  • Flink SQL 支持带有水印的复杂事件时间处理
  • 及时跟踪进度可有效执行连续查询
    • 确定计算输入何时完成
    • 确定何时不再需要行数据并清理状态
    • 定期触发计算并更新结果
  • 这些对流的优化不会影响查询语义

Flink 1.14 中的 SQL 功能集

流& 批

  • SELECT FROM WHERE
  • GROUP BY [HAVING]
    • 非窗口的
    • 滚动、跳跃、session窗口
  • JOIN
    • 基于时间窗口的 INNER + OUTER JOIN
    • 非窗口的INNER + OUTER JOIN
  • Set Operations
  • 用户自定义函数

    • 标量的
    • 聚合的
    • Table-valued(表值的)

  • Window Table-Valued Functions

    • 滚动、跳跃、session窗口
  • OVER / WINDOW
    • 无界+有界前置
  • INNER JOIN
    • 临时表
    • 外部查找表
  • MATCH_RECOGNIZE

    • 模式匹配/CEP

      Full TPC-DS support

      用户自定义函数 (UDFs)

      应用很多工作来通过用户定义的函数使 Flink SQL 可扩展。
  • 标量:返回单个值

  • 聚合函数:多行输入到单个输出
  • 表函数:返回一张表,包含一行或多行,而不是单个值
  • 表聚合函数:从多行聚合输入,返回一张表
  • 异步表函数执行外部查找
  • 矢量化函数从(python)pandas.Series 对象中获取输入

参考文献

物化视图是将查询结果预先计算并存储的一张特殊的表。”物化”(Materialized) 这个词是相对于普通视图而言。普通视图较普通的表提供了易用性和灵活性,但无法加快数据访问的速度。物化视图像是视图的缓存,它不是在运行时构建和计算数据集,而是在创建的时候预先计算、存储和优化数据访问,并自动刷新来保证数据的实时性。