1.3 Flink的API

本节我们进入Flink API的学习阶段,通过本节的介绍,我们可以知道使用哪门语言、写什么样的代码才能完成Flink作业的开发。

如图1-10所示,Flink为我们抽象了4种级别的API,分别是SQL API、Table API、DataStream API和有状态流处理API。

越往上,API的标准化程度越高,处理的数据的结构化程度也越高,同时,API也越简单,用户越容易理解和使用。注意,虽然越往上标准化程度越高,但是使用API时的灵活性也会越来越低,因此上层API常用于处理数据结构相对标准化的简单需求,下层API常用于处理个性化的复杂需求。

图1-10 Flink提供的4种API

提示

图1-10中的Table API是一种声明式DSL,使用声明式DSL开发Flink作业时只需要表达数据是怎样处理的、期望得到怎样的结果,而不需要去详细实现数据处理的逻辑。在Flink中,Table API、SQL API都是声明式DSL。以SQL API为例,用户通过一条SQL语句描述数据应该怎样处理,然后提交并执行Flink SQL API作业就可以得到数据结果;而DataStream API和有状态流处理API严格来说都是非声明式API,用户需要详细实现数据的处理逻辑。

对于初学者来说,要做到清晰地理解和划分这4种API不太容易,因此我按照编写Flink作业时的编码方式将这4种API划分为两类,分别是Code API和关系型API,如图1-11所示。

1.3.1 Code API

Code API指需要通过Java、Scala、Python编程语言编写具体的数据处理逻辑来完成Flink作业开发,Flink提供的DataStream API和有状态流处理API属于此类。

图1-11 4种API再分类

1.DataStream API

我们使用Java、Python、Scala编程语言以及Flink针对这3种语言提供的DataStream API来开发一个Flink作业。

代码清单1-1所示是使用Flink为Java提供的DataStream API开发的Flink作业,DataStream API名称源自DataStream类。在Flink 1.14之前的版本中,Flink针对批处理还提供了DataSet API,而在1.14及之后的版本中,Flink将流处理和批处理API统一到了DataStream API中,我们可以直接使用DataStream API开发流处理任务以及批处理任务。

代码清单1-1 DataStream API案例

DataStream API是日常开发中最常用的一种API,它预置了各种类型的数据源(Source)、数据转换(Transformation)、数据关联(Join)、数据聚合(Aggregate)、时间窗口(TimeWindow)以及状态(State)相关的API,我们可以使用这些预置的API来实现日常场景中大多数的需求。第4章会详细介绍DataStream API预置的各类API的详细使用方法。

2.有状态流处理API

有状态流处理API使用的编程语言和DataStream API是一样的,不同之处在于实现用户自定义函数时需要使用Flink为有状态流处理API提供的ProcessFunction。

如代码清单1-2所示,ProcessFunction和DataStream API进行了良好的集成,KeyedProcess-Function就是其中一种ProcessFunction。在实际开发Flink作业时,通常会混用DataStream API和有状态流处理API,并不会刻意区分。

代码清单1-2 有状态流处理API案例

有状态流处理API包含了DataStream API的所有功能。此外,在有状态流处理API中使用ProcessFunction可以更加自由地控制时间。举例来说,在DataStream API中,基于时间窗口的数据处理要么是事件时间语义,要么是处理时间语义,通常不会同时出现两种时间语义。而在有状态流处理API中,我们可以根据需求同时注册事件时间、处理时间的定时器,并在触发两种时间的定时器时,通过回调函数处理数据,这样可以帮助我们更灵活地处理数据。

1.3.2 关系型API

关系型API主要通过编写类SQL代码完成Flink作业的开发,Flink中的SQL API和Table API属于此类。

1.Table API

我们可以使用Java、Python、Scala语言,通过Table API提供的关系型API开发一个Flink作业。如代码清单1-3所示,Flink Table API内置了常见关系模型中的select、project、join、group-by和aggregate等处理数据的API。

代码清单1-3 Table API案例

相比DataStream API来说,Table API有以下两个明显的优点。

❑关系型API具备易用性、通用性:Table API是一种关系型API,或者说是一种类SQL的API,因此只要用户对SQL有一定的了解,就很容易上手Table API。

❑Table API屏蔽了Flink中状态相关的复杂接口:屏蔽Flink底层的复杂原理可以帮助用户专注于业务逻辑,降低开发和理解成本,这其实也是Flink在设计Table API和SQL API时的一个重要目标。

2.SQL API

和Table API类似,SQL API也基于关系模型,但是编程语言上使用了SQL语句,如代码清单1-4所示。

代码清单1-4 SQL API案例

SQL API遵循ANSI SQL标准,和MySQL、Hive SQL、Spark SQL的语法几乎一致,因此SQL有的特点它都有,比如学习成本低、维护成本低,适合大面积推广应用。

Flink还对SQL API、Table API与DataStream API之间进行了桥接,我们不但可以在SQL API和Table API之间无缝切换,还可以将SQL API、Table API处理的结果作为DataStream API的输入,使用DataStream来定义复杂的数据处理逻辑。反之,也可以将DataStream API处理的结果作为SQL API、Table API的输入,使用SQL API、Table API进行处理。