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之间的转换信息,实现子类主要有以下几种

image-20220322232932772

  • 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实现

如下所示:

image-20220322235021615

  • MultipleInputStreamOperator、TwoInputStreamOperator、OneInputStreamOperator接口继承StreamOperator(定义不同输入数量的StreamOperator方法)
  • AbstractStreamOperator、AbstractStreamOperatorV2抽象类继承和实现StreamOperator
  • TwoInputStreamOperator、OneInputStreamOperator类型的算子最终都会继承AbstractStreamOperator实现类

2.3.1 StreamOperator接口实现

该接口实现的方法主要供Task调用和执行,主要包含以下方法:

image-20220323000026008

  • open():初始化方法,数据元素被处理之前调用,包含算子的初始化逻辑,比如调用RichFunction的open()方法
  • finish():数据处理完之后调用,flush剩余的数据,当该方法被调用后,不会再有更多的数据给下游生产
  • close():算子生命周期结束时调用,不管是在成功完成或者失败和取消的情况下,可以释放资源,但是不能发送任何数据
  • prepareSnapshotPreBarrier():正式执行checkpoint之前调用该方法
  • snapshotState():快照
  • initializeState():算子重启或启动时,通过该方法初始化状态数据
posted @ 2022-03-23 00:17  马晟  阅读(296)  评论(0编辑  收藏  举报