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构造器类似,需要input和operator两个参数(只不过这里的operator类型是对应的OneInputStreamOperator)。
子类TwoInputTransformation
表示接收两种输入的StreamTransformation(接收两种流作为输入)。其他的实现同OneInputTransformation。