写点什么

Flink API 的 4 个层次

作者:阿泽🧸
  • 2023-05-06
    北京
  • 本文字数:1476 字

    阅读完需:约 5 分钟

Flink API的4个层次

从纵向来看 Flink 中的 API 分为 4 个层次,从下而上,API 层次越高,抽象程度越高,使用起来越方便,灵活性则会降低。

1、核心底层 API

核心底层 API 提供了 Flink 的最底层的分布式计算构建块的操作 API,包含了 ProcessFunction、状态、时间和窗口等操作的 API。


ProcessFunction 是 Flink 提供的最具表现力的底层功能接口。Flink 提供单流输入的 ProcessFunction 和双流输入的 CoProcessFunction,能够对单个事件进行计算,也能够按照窗口对时间进行计算。


ProcessFunction 提供对时间和状态的细粒度控制能力,它可以处理事件时间和处理时间两种时间概念,在时间上定义、修改触发回调函数的触发器。因此,ProcessFunction 可以实现许多有状态计算中的复杂业务逻辑。

2、核心开发 API (DataStream/DataSet API)

DataStream/DataSet 使用 Fluent 风格 API,提供了常见数据处理的 API 接口,如用户指定的各种转换形式,包括连接(Join)、聚合(Aggregation)、窗口(Window)、状态(State)等。在这些 API 中处理的数据类型以各自的编程语言定义为 Class 类(Java 类或者 Scala 类)。同时为了提供灵活性,DataStream/DataSet 中也提供了直接使用底层 ProcessFunction 的能力,使得一些特定的操作可以实现更低层次的抽象如 DataSet API 为有界数据集提供了额外的原函数(如循环/迭代)。

3、声明式 DSL API

Table API 是以表为中心的声明式领域专用语言(Domain Specified Language,DSL)。表是关系型数据库的概念,用在批处理中。


Table API 遵循(扩展)关系模型,使用 Schema 定义元数据(与关系数据库中的表相似),提供 Table API 实现 SQL 操作,如 select、project、join、group-by、aggregate 等。Table API 表达的是“应该做什么”的逻辑操作,而不是编写如何处理数据的底层代码。


此外,Table API 程序还可以通过在执行之前使用 SQL 优化器进行优化。可以在表和 DataStream/DataSet 之间无缝转换,允许程序中混合使用 Table API 和 DataStream/DataSet API。

4、结构化 API

SQL 是 Flink 的结构化 API,是最高层次的计算 API,与 Table API 基本等价,区别在于使用的方式。SQL 与 Table API 可以混合使用,SQL 可以操作 Table API 定义的表,Table API 也能操作 SQL 定义的表和中间结果。


SQL 对复杂逻辑的语义表达不如 DataStream API,但是 SQL 也带来了不少好处。

  • 缩短上线周期

传统的实现流计算的方式是通过流计算平台提供的 API 进行编程的,包括确定需求、实现设计、编写代码、进行本地单元测试、进行集成测试,没有问题后部署上线等流程。整个开发过程中,开发人员不光要满足业务需求,还需要关注技术实现的细节,而使用 SQL 的方式后,开发人员只要关注业务需求即可,技术实现的细节可以交给 SQL 引擎去解析、编译、优化。最终,相比传统的通过编码实现流计算的方式,上线周期可以从数天缩短为数小时。

  • 更好地支持流计算需求的演变

随着业务需求持续不断的变化,编码方式的开发、测试、部署上线的周期不能很快的响应业务需求的变化,使用 SQL 则能够缩短开发、测试、部署的周期。

  • 自动调优

查询优化器可以为用户的 SQL 生成最高效的执行计划。用户不需要了解它就能自动享受优化器带来的性能提升。

  • 接口稳定

SQL 拥有几十年的历史,是一个非常稳定的语言,很少有变动。所以升级引擎的版本、甚至替换成另一个引擎时,都可以做到兼容并且平滑地升级。

  • 易于理解

SQL 的学习门槛很低,很多不同行业不同领域的人都懂 SQL,用 SQL 作为跨团队的开发语言可以大大提高效率。


在 Flink1.9 及以后的版本中,Flink 会在 API 层面上统一 DataStream 流处理 API 和 DataSet 批处理 API,DataSet API 会逐渐被废弃,未来会使用 DataStream API 统一表达流批两种处理,作为流批统一的计算引擎,这种做法是合理的。

发布于: 刚刚阅读数: 4
用户头像

阿泽🧸

关注

还未添加个人签名 2020-11-12 加入

还未添加个人简介

评论

发布
暂无评论
Flink API的4个层次_flink_阿泽🧸_InfoQ写作社区