Flink代码浅析之Transformation类 | 青训营笔记

146 阅读2分钟

Flink代码浅析之Transformation类 | 青训营笔记

这是我参与「第四届青训营 」笔记创作活动的第3天。

org.apache.flink.api.dag.Transformation.java github地址:flink/Transformation.java at master · apache/flink (github.com)

Transformation

类的功能解析

  • 源码注释表示,Transformation表示创建DataStream的操作。我们说的每一个DataStream都有一个对应的Transformation,它是DataStream的起源。

  • 每一次操作(map、flatmap等)都是在新建一个Transformation并将当前Transformation与下一个建立链接的关系。

  • 当进行API操作时,例如DataStream#map,将会创建1个Transformations树。在流程序执行时,该graph将被StreamGraphGenerator转换为StreamGraph。

  • Transformation 在运行时不一定对应一个物理操作。有些操作只是逻辑概念。例如union, split/select data stream, partitioning等操作。

<p>The following graph of {@code Transformations}:
 *
 * <pre>{@code
 *   Source              Source
 *      +                   +
 *      |                   |
 *      v                   v
 *  Rebalance          HashPartition
 *      +                   +
 *      |                   |
 *      |                   |
 *      +------>Union<------+
 *                +
 *                |
 *                v
 *              Split
 *                +
 *                |
 *                v
 *              Select
 *                +
 *                v
 *               Map
 *                +
 *                |
 *                v
 *              Sink
 * }</pre>
 *    上图运行时将转换为下图
 *
 * <pre>{@code
 * Source              Source
 *   +                   +
 *   |                   |
 *   |                   |
 *   +------->Map<-------+
 *             +
 *             |
 *             v
 *            Sink
 * }</pre>
 *

部分属性解析

    // 每个Transformation都拥有唯一的id
    private static final AtomicInteger ID_COUNTER = new AtomicInteger(0);

	//Transformation的id
    protected final int id;

	//Transformation的名称,用于可视化和log
    protected String name;

    protected String description;

	//并行度
    private int parallelism;

    /**
     *当前Transformation的最大并行度。
     */
    private int maxParallelism = -1;

    /**
     * 用户赋予的特殊id,用户指定的uid,该uid的主要目的是用于在job重启时可以再次分配跟之前相同的uid,应该是用于持久保存状态的	  *目的。
     */
    private String uid;

	//buffer超时时间
    protected long bufferTimeout = -1;

ps:在这里挑自己第一次看不是很能理解的Transformation进行解析

子类OneInputTransformation

接受一种输入的StreamTransformation(换句话说,只接收一个输入流)。跟SinkTransformation构造器类似,需要inputoperator两个参数(只不过这里的operator类型是对应的OneInputStreamOperator)。

子类TwoInputTransformation

表示接收两种输入的StreamTransformation(接收两种流作为输入)。其他的实现同OneInputTransformation