这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战
1. Transformation是什么
- Tranformation是当前的DataStream对应的上一次的转换操作.即上一次的DataStream通过一个Transformation操作生成当前的dataStream
- 一个flink流式程序通过一个个tansformation操作,组成了 一幅图.当该flink流式程序被执行的时候,会被StreamGraphGenerator组件翻译成一个StreamGraph
- 不是所有的Transformation操作都会在运行的时候被映射成像map、fliter之类的物理操作,一些tranformation是逻辑上的概念。例如union,split/select data strea,partitioning
2.Transformation的子类
Tranformation血缘关系图
- 如图所示,Transformation是一个抽象类,主要是通过PhysicalTransformation以及其他类型的Transformation构成
2.1 PhysicalTransformation构成
- PhysicalTransformation的区别
PhysicalTransformation的区别于其他Transformation的一大特点就是提供了setChainingStrategy方法 ,可以将上下游的算子根据指定的策略进行连接,链接的好处就是减少Operator之间的网路传输 有如下几种策略
ALWAYS: 代表Transformation中的算子会和上游的算子尽可能的链化操作,这些算子会在同一个thread中被处理,会将多个operator组成一个operatorNEVER: 代表了Transformation中的Operator永远不会和上下游的算子之间链化,operator运行在独立的SubTask中HEAD: 代表了当前的Transformation对应的operation为头部算子,不能和上游算子进行链化,但是可以和下游算子进行链化
AbstractStreamOperator的默认值是HEAD模式,但大多数继承AbstractStreamOperator的值都是ALWAYS
- PhysicalTransformation的子类
- OneInputTranformatin: 单进单出的数据集转换操作,例如Map、filter等操作
- twoInputTransformation: 双进单出的数据集转换操作,例如DataStream于DataStream进行join操作,且该转换操作中的Operator的类型为TwoInputStreamOperator
- SinkTranforamation: 数据集输出操作,用户调用DataStream.addSink()方法时,就会同步创建SinkTransformation操作
- SourceTransfomation:数据集输入操作,用户调用DataStream.addSource()方法时,会创建SourceTranformation
Tranformation构成展示
2.2 其他类型的Tranformation
- 其他类型Transformation链化区别
- 这些transformation操作直接继承至Tranformation抽象类,这部分tranformation本身不能生成physical operation,仅仅只是影响上一个tranformation是如何和下个Transformation如何进行分配的.类似于SelectTranformation和PartitionTransformation,这些操作没有涉及到数据处理,只是对数据进行分流
- 其他tranformation组成
- SelectTranformation:根据用户提供的SelectName从上游Datastream中选择需要输出到下游的数据
- PartitionTransformation: 代表对输入的元素的分区进行改变
- UnionTransformation:代表了对多个输入Transformation进行合并
- SideOutputTranformation: 代表将根据OutputTag筛选上游DataStream中的数据并发送到下游去
- CoFeedbackTransformation: 用于迭代计算中单输入反馈数据流节点的转换操作
- FeedbackTransformation: 用于迭代计算中双输入反馈数据节点的转换操作
参考文献
Flink设计与实现:核心原理与源码解析