• 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():算子重启或启动时,通过该方法初始化状态数据
  • 相关阅读:
    使用JDK创建webService
    eclipse换工作空间要做的事情
    JAVA输出表格(适配中英文)
    linux下如何用GDB调试c++程序
    C++编译的四个步骤
    linux下如何设置root密码(第一次)
    chp01、Dreamweaver介绍
    服务器端程序
    1_计算机网络概述
    Oracle Java JDBC: Get Primary Key Of Inserted Record
  • 原文地址:https://www.cnblogs.com/jordan95225/p/16042263.html
Copyright © 2020-2023  润新知