在前文我们写了一个WordCount程序体验了一下flink程序的编写。在本篇中我们详细学习下flink api的分类及其应用场景。
Flink’s API
flink提供了4个层次的api抽象:
- 在最下层,就是有状态流式编程,它提供了
ProcessFunction
API。flink在这个底层api上帮我们实现了最基础的流式处理能力,我们可以在上门进行有状态编程,并且我们可以自定义定时器,可以实现复杂的时间语义处理。(注意:ProcessFunction
是嵌入到DataStream
API中使用的)。 - 在core api层,flink提供了
DataStream
API和DataSet
API。这两个API提供了数据处理的基本操作:各种数据转化(map,flatmap,filter等等),分组,join,window,状态编程等等。我们在前文写的WordCount程序就是基于DataStream
API实现的。 Table API
是基于表的声明式dsl。它与DataStream
区别主要在以下几个方面:- 遵循关系型数据模型,自带schema,提供了类sql操作,如select,project,join,group-by等等。
- 声明式api,指定数据处理逻辑,不指定代码实现逻辑
- 可实现udf,但是表达力不如core api
- 在执行前,计划器会优化执行逻辑
Table
可与DataStream/DataSet
无缝转化。
- flink提供的最高层api是flink-sql。它的抽象层次与
Table API
类似,但是允许用户直接写sql便可以执行job,而无需会写java或scala代码。
这四层关系很好理解,简单总结一下,主要是有以下两点:
1. 越往上层,开发人员写的代码越简洁,面向的开发人员越广。
2. 越往上层,处理的数据越结构化,功能灵活性越低。