flink:StreamExecutionEnvironment、DataStream和Transformation与StreamOperator

1、StreamExecutionEnvironment:
StreamExecutionEnvironment是构建执行任务环境以及任务的启动的入口,主要具备以下几方面的职责:
a、存储全局相关的参数,如执行环境配置ExecutionConfig、检查点配置CheckpointConfig,任务的转换算子transformations等等;
private final ExecutionConfig config = new ExecutionConfig();
执行环境的相关配置
private final CheckpointConfig checkpointCfg = new CheckpointConfig();
检查点的相关配置
protected final List<Transformation<?>> transformations = new ArrayList<>();
transformations是转换算子的集合,但不包含source,构建任务时进一步转化为DataStream。

b、对外提供统一的创建ExecutionEnvironment入口,他提供了一些静态方法,如getExecutionEnvironment方法;
补充一点,local模式启动时,如果引入了flink-runtime-web期望使用web-UI时,可以通过createLocalEnvironmentWithWebUI方法创建执行环境
StreamExecutionEnvironment streamEnv = StreamExecutionEnvironment.createLocalEnvironmentWithWebUI(new Configuration());
默认端口是8081或者通过Configuration指定,如不使用此方法创建,则每次启动会随机生成一个端口来使用。

c、提供一些列的全局参数的配置/获取入口,诸如set/get/enable等方法;
如设置并行度、检查点、chain开关等等

d、如果把flink的流计算过程简单理解为数据输入->转换计算->数据输出的三部曲的话,这里作为入口提供了关于数据输入的一些列添加数据输入的方法;
如formXXX集合系列、addSource数据源系列,socket/file系列等等。

e、提供计算任务启动执行的入口。
StreamExecutionEnvironment有两个子类,分别是LocalStreamEnvironment和RemoteStreamEnvironment,LocalStreamEnvironment用于构建和执行基于本地jvm进程的计算任务,RemoteStreamEnvironment用于构建和提交基于远端flink集群的计算任务。

2、DataStream

DataStream个人理解是流式数据处理的核心API,同时也是对转换算子Transformation的进一步封装,在持有某一个算子数据的同时也持有StreamExecutionEnvironment执行环境对象,按照操作的对象和类型可以简单划分为四大类:
a、对于单条数据的操作:如map、filter等操作
b、对于多条数据的操作:如keyBy、partition等操作
c、对多个流转换合并为1个流的操作:如union、connect等操作
d、对1个流拆分为多个流的操作:如split操作
该类的集成体系如下图所示,可自行理解对应到上面的分类,当然在org.apache.flink.streaming.api.datastream包下面还定义了一些其他的Stream暂不在本次谈论范围之列:

3、Transformation
Transform被定义为了一个抽象类,在另一篇分析https://www.cnblogs.com/wangwei0721/p/14012174.htmlStreamGraph生成过程中有涉及,再看一次他的集成体系

同样的,一方面可以将算子转换的分类与DataStream对算子的操作的分类对应起来,同时从另一个维度来看,也可以简单的将Transformation划分为以下两类:
a、继承自PhysicalTransformation的一些服务算子转换
在PhysicalTransformation抽象类中,定义了public abstract void setChainingStrategy(ChainingStrategy strategy);模板方法,该方法要求其子类提供算子合并策略ChainingStrategy,该参数在后续计算优化算子合并时会用到。
ps:ChainingStrategy是一个枚举类,有HEAD、NEVER和ALWAYS三个枚举值,HEAD标识该算子仅作为头,不参与合并链,但支持后继合并到自己,NEVER标识该算子既不向前合并也不被后继合并,要作为独立节点处理,ALWAYS标识该算子的合并意愿很强,支持随时按规则合并。
在PhysicalTransformation的子类中,由于该全部子类是支持执行物理转换,意思是说该算子时一定产生数据输入和输出的,所以在全部子类中都Transformation作为input同时持有一个StreamOperatorFactory对象,用于产生对应的StreamOperator将来作为outPut;
b、其他的逻辑算子转换
其他逻辑转换算子则仅持有Transformation作为input输入以及一些其他的属性。

4、StreamOperator
StreamOperator是一个接口,标识了流计算的具体算子转换对象接口,具备相关的生命周期、快照等行为。

5、把这四个类放一起分析的原因
研究下flink源码,不难看出以上四个类可以理解为都是位于DataStream API层,他们承载了将用户的输入程序化构建为DAG图,将计算逻辑进行互相合理转化,弄清楚他们的属性和行为对进一步分析flink源码是很有必要的。

posted @ 2020-11-30 20:29  wangwei0721  阅读(2302)  评论(0编辑  收藏  举报