Flink源码解析(二)——Flink流计算应用执行环境解析

在Flink应用执行过程中会涉及三种主要的执行环境变量,分别为StreamExecutionEnvironment、Environment、RuntimeContext。它们的作用层次、作用时机、作用范围各不相同。三种环境对象的关系如下图:

下面分别介绍三种过环境对象的细节信息。

一、StreamExecutionEnvironment解析

StreamExecutionEnvironment是Flink应用开发时的概念,表示流计算作业的执行环境。它是应用开发配置、属性设置的起点,数据源生成的接口,作业开始执行的入口、并负责创建不同类型的执行环境。下面解析这四个方面功能的代码逻辑。

1、开发配置及属性设置

(1)、当前StreamExecutionEnvironment配置对象并未统一,config负责环境的执行配置,checkpointCfg配置负责checkpoint行为,长期来看DataStream相关的api配置会统一添加至configuration配置变量中。

(2)、transformations集合负责存储DataStream api转化而来的transformation。类似map、flatmap、filter等api入参Funtion变量会设置到AbstractUdfStreamOperator算子类的userFunction成员中,一个个算子实例转化成Transformation实例并添加到transformations集合。后续随笔会着重讲解api转化为Transformation过程。

(3)、bufferTimeout代表buffer输出的刷新时间。

(4)、isChainingEnabled代表合成算子链开关。上下游有条件chaining的算子合成算子链后会提高程序的执行性能。

(5)、defaultStateBackend状态后端变量,和状态保存有关。

(6)、timeCharacteristic流计算应用的时间语义。

(7)、slotSharingGroupResources槽位共享组的资源概况。

2、数据源生成接口

(1)、从内存中读取数据

public DataStreamSource<Long> fromSequence(long from, long to);
public final <OUT> DataStreamSource<OUT> fromElements(OUT... data);
public final <OUT> DataStreamSource<OUT> fromElements(Class<OUT> type, OUT... data);
public <OUT> DataStreamSource<OUT> fromCollection(Collection<OUT> data);
public <OUT> DataStreamSource<OUT> fromCollection(Collection<OUT> data, TypeInformation<OUT> typeInfo);
public <OUT> DataStreamSource<OUT> fromCollection(Iterator<OUT> data, Class<OUT> type);
public <OUT> DataStreamSource<OUT> fromCollection(Iterator<OUT> data, TypeInformation<OUT> typeInfo);
public <OUT> DataStreamSource<OUT> fromParallelCollection(SplittableIterator<OUT> iterator, Class<OUT> type);
public <OUT> DataStreamSource<OUT> fromParallelCollection(SplittableIterator<OUT> iterator, TypeInformation<OUT> typeInfo);

(2)、从文件读取数据

当前文件读取readFile() api已是deprecated状态,推荐使用FileSource文件数据源类的forRecordStreamFormat()、forBulkFileFormat()、forRecordFileFormat()方法。

(3)、从socket读取数据

public DataStreamSource<String> socketTextStream(String hostname, int port, String delimiter, long maxRetry);

入参分别代表主机名、端口号、数据分隔符、最大重试次数

(4)、自定义读取数据

private <OUT> DataStreamSource<OUT> createInput(InputFormat<OUT, ?> inputFormat, TypeInformation<OUT> typeInfo, String sourceName);

private <OUT> DataStreamSource<OUT> createFileInput(inputFormat,typeInfo,sourceName,monitoringMode,interval);

private <OUT> DataStreamSource<OUT> addSource(function,sourceName,typeInfo,boundedness);

public <OUT> DataStreamSource<OUT> fromSource(source,timestampsAndWatermarks,sourceName,typeInfo);

其中fromSource方法适配flink新数据源架构的使用方法。

3、作业执行入口

public JobExecutionResult execute();

execute()方法是流计算应用的执行入口,业务逻辑编写完成后调用execute()方法才会触发程序的执行。该方法在应用提交阶段负责创建StreamGraph、JobGraph、ExecutionGraph等数据结构,最后Flink调度组件将Task分配到集群各节点上开始执行Task。Graph转换过程是DataStream api转换为Transformation,进而经过StreamGraph->JobGraph->ExecutionGraph及调度执行Task计算等。后续随笔会详细讲解各个环节的转换细节。

4、不同类型执行环境

getExecutionEnvironment();
createLocalEnvironment();
createLocalEnvironmentWithWebUI();
createRemoteEnvironment();

以上方法主要创建StreamExecutionEnvironment、LocalStreamEnvironment、RemoteStreamEnvironment、StreamContextEnvironment、StreamPlanEnvironment等不同类型的执行环境。

所有执行环境过包括相同的工作流程,如下:执行Flink作业main(...)方法生成StreamGraph、JobGraph,设置任务配置信息、提交JobGraph到Flink集群开始调度执行。

二、Environment解析

Environment代表Flink运行时环境,该接口定义了运行时刻Task的配置信息。主要有两个实现类:RuntimeEnvironment和SavepointEnvironment。

//Task.java

doRun(){...}

Environment实例包含Task执行所需要的核心组件MemoryManager、IOManager、BroadcastVariableManager、TaskStateManager、InputSplitProvider、TaskEventDispatcher等。大部分组件都是TaskManager级别组件,如MemoryManager是TaskManager级别的组件,负责管理单个TaskManager的内存资源等。后续会详细介绍各个组件的作用。

三、RuntimeContext解析

RuntimeContext是Function运行时上下文,封装了Function运行时需要的所有信息,如并行度信息、Task名称、ExecutionConfig、State等。RichFunction接口及其子类通过方法getRuntimeContext()可以获取该对象,进而执行状态操作等行为。RuntimeContext主要的实现类有StreamingRuntimeContext、SavepointRuntimeContext等。

posted @ 2023-08-10 10:04  有一个娃  阅读(540)  评论(0编辑  收藏  举报