Flink源码-DataStream
2.DataStream
2.1 主要组成
2.1.1 主要成员
DataStream代表一系列同类型数据的集合,可以通过转换操作生成新的DataStream
DataStream用于表达业务转换逻辑,实际上并没有存储真实数据
主要包括两个成员:
- StreamExecutionEnvironment
- Transformation
:当前DataStream对应的上一次的转换操作,每个Transformation包含相应的StreamOperator,比如map()方法内部生成的就是StreamMap算子
2.1.2 StreamMap实例
对DataStream.map()方法进行分析:
调用链
map(MapFunction<T, R> mapper) -> map(MapFunction<T, R> mapper,TypeInformation<R> outputType) -> transform(String operatorName,TypeInformation<R> outTypeInfo,OneInputStreamOperator<T, R> operator) -> doTransform(String operatorName,TypeInformation<R> outTypeInfo,StreamOperatorFactory<R> operatorFactory)
最后的doTransform方法源码如下:
protected <R> SingleOutputStreamOperator<R> doTransform(
String operatorName,
TypeInformation<R> outTypeInfo,
StreamOperatorFactory<R> operatorFactory) {
// read the output type of the input Transform to coax out errors about MissingTypeInfo
// 获取 TypeInformation 信息,确保不会出现 MissingTypeInfo错误,下游算子转换不会出现错误
transformation.getOutputType();
// 创建 OneInputTransformation 实例
OneInputTransformation<T, R> resultTransform =
new OneInputTransformation<>(
this.transformation,
operatorName,
operatorFactory,
outTypeInfo,
environment.getParallelism());
@SuppressWarnings({"unchecked", "rawtypes"})
// 基于 OneInputTransformation 实例创建 SingleOutputStreamOperator
// 该类继承自 DataStream ,用于每次转换操作后返回给用户继续操作的数据结构
SingleOutputStreamOperator<R> returnStream =
new SingleOutputStreamOperator(environment, resultTransform);
// 将创建好的 OneInputTransformation 实例添加到 Transformation 集合,用于生成 StreamGraph 对象
// StreamExecutionEnvironment.getStreamGraph(boolean) 生成
getExecutionEnvironment().addOperator(resultTransform);
// returnStream 返回给用户,执行后续转换操作
return returnStream;
}
2.2 Transformation详解
Transformation负责描述DataStream之间的转换信息,实现子类主要有以下几种
-
map、filter等算子封装在OneInputTransformation中
-
join、connect等对应TwoInputTransformation
-
在Transformation基础上抽象出PhysicalTransformation类,该类中提供
setChainingStrategy(ChainingStrategy strategy)
方法,可以将上下游算子按照指定策略连接,ChainingStrategy支持四种策略:
- ALWAYS:该Transformation中的算子和上游算子尽可能chain,将多个Operator组合成OperatorChain(尽可能避免网络数据交换,提高性能)
- NEVER:该Transformation中的算子和上游算子永远不chain
- HEAD:该Transformation对应的算子为头部,不支持上游算子chain,但是可以和下游算子chain
- HEAD_WITH_SOURCES:类似于HEAD,但是会尽可能尝试chain source input,允许多个输入算子chain到一个task中
2.3 StreamOperator实现
如下所示:
- MultipleInputStreamOperator、TwoInputStreamOperator、OneInputStreamOperator接口继承StreamOperator(定义不同输入数量的StreamOperator方法)
- AbstractStreamOperator、AbstractStreamOperatorV2抽象类继承和实现StreamOperator
- TwoInputStreamOperator、OneInputStreamOperator类型的算子最终都会继承AbstractStreamOperator实现类
2.3.1 StreamOperator接口实现
该接口实现的方法主要供Task调用和执行,主要包含以下方法:
- open():初始化方法,数据元素被处理之前调用,包含算子的初始化逻辑,比如调用RichFunction的open()方法
- finish():数据处理完之后调用,flush剩余的数据,当该方法被调用后,不会再有更多的数据给下游生产
- close():算子生命周期结束时调用,不管是在成功完成或者失败和取消的情况下,可以释放资源,但是不能发送任何数据
- prepareSnapshotPreBarrier():正式执行checkpoint之前调用该方法
- snapshotState():快照
- initializeState():算子重启或启动时,通过该方法初始化状态数据