Flink内核原理与实现
上QQ阅读APP看书,第一时间看更新

2.1 Flink应用开发

上一章简要地介绍了Flink的设计理念、特点、生态与技术栈、运行架构,在深入Flink之前,还有必要对Flink内部的一些核心概念、流程进行总体性的阐述。

Flink作为批流一体的计算引擎,其面对的是业务场景,面向的使用者是开发人员和运维管理人员。

Flink应用程序(简称Flink应用),也叫作Flink作业、Flink Job。Flink作业包含了两个基本的块:数据流(DataStream)和转换(Transformation)。DataStream是逻辑概念,为开发者提供了API接口,Transformation是处理行为的抽象,包含了数据的读取、计算、写出。所以Flink的作业中的DataStream API调用,实际上构建了多个由Transformation组成的数据处理流水线(Pipeline)。

DataStream API和Transformation的转换如图2-1所示。

图2-1 Flink DataStream API与Transformation的转换

执行时,Flink应用被映射成Dataflow,由数据流和转换操作组成。每个Dataflow从一个或多个数据源开始,并以一个或多个Slink输出结束。Dataflow本质上是一个有向无环图(DAG),但是允许通过迭代构造允许特殊形式的有向有环图。为了简单起见,大部分任务都是有向无环图。

Flink应用由相同的基本部分组成。

(1)获取参数(可选)

如果有配置参数,则读取配置参数,可以是命令行输入的参数,也可以是配置文件(配置文件可能是命令行给的1个配置文件路径)。

(2)初始化Stream执行环境

这是必须要做的,读取数据的API依赖于该执行环境。

(3)配置参数

读取到的参数可以是执行环境参数或者业务参数。执行环境参数调用对应的API赋予即可,这些参数会覆盖flink.conf中默认的配置参数,如最大并行度maxParallism等。如果是业务级的参数,可以放入GlobalJobParameters中,在Job执行时从GlobalJobParameters读取参数。

一般在生产或者实际的应用场景中,多多少少需要提供一些配置信息,如果只是为了学习用途,则可以不用考虑。

GlobalJobParameters可以视作一个Map,执行环境参数等具体细节可以参照官方文档的详细说明。

(4)读取外部数据

Flink作为分布式执行引擎,本身没有数据存储能力,所以定义了一系列接口、连接器与外部存储进行交互,读写数据。

在Flink中,数据来源叫作Source,Flink支持从Kafka、HDFS、HBase、数据库等外部存储读取数据。

(5)数据处理流程

调用DataStream的API组成数据处理的流程,如调用DataStream.map().filter()...组成一个数据处理流水线。

(6)将处理结果写入外部

在Flink中将数据写入外部的过程叫作Sink,Flink支持写出数据到Kafka、HDFS、HBase、数据库等外部存储。

(7)触发执行

StreamExecutionEnvironment#execute是Flink应用执行的触发入口,无论是一般的DataStream API开发还是Table &SQL开发都是如此。

调用该API之后,才会触发后续的一系列生成StreamGraph、JobGraph、ExecutionGraph和任务分发执行的过程。