# Flink源码系列--Transformation

751 阅读3分钟

这是我参与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的子类

image.png

Tranformation血缘关系图

  • 如图所示,Transformation是一个抽象类,主要是通过PhysicalTransformation以及其他类型的Transformation构成

2.1 PhysicalTransformation构成

  • PhysicalTransformation的区别

PhysicalTransformation的区别于其他Transformation的一大特点就是提供了setChainingStrategy方法 ,可以将上下游的算子根据指定的策略进行连接,链接的好处就是减少Operator之间的网路传输 有如下几种策略

  1. ALWAYS : 代表Transformation中的算子会和上游的算子尽可能的链化操作,这些算子会在同一个thread中被处理,会将多个operator组成一个operator
  2. NEVER : 代表了Transformation中的Operator永远不会和上下游的算子之间链化,operator运行在独立的SubTask中
  3. HEAD : 代表了当前的Transformation对应的operation为头部算子,不能和上游算子进行链化,但是可以和下游算子进行链化

AbstractStreamOperator的默认值是HEAD模式,但大多数继承AbstractStreamOperator的值都是ALWAYS

  • PhysicalTransformation的子类
  1. OneInputTranformatin: 单进单出的数据集转换操作,例如Map、filter等操作
  2. twoInputTransformation: 双进单出的数据集转换操作,例如DataStream于DataStream进行join操作,且该转换操作中的Operator的类型为TwoInputStreamOperator
  3. SinkTranforamation: 数据集输出操作,用户调用DataStream.addSink()方法时,就会同步创建SinkTransformation操作
  4. SourceTransfomation:数据集输入操作,用户调用DataStream.addSource()方法时,会创建SourceTranformation

Transformation构成展示.PNG

Tranformation构成展示

2.2 其他类型的Tranformation

  • 其他类型Transformation链化区别
  1. 这些transformation操作直接继承至Tranformation抽象类,这部分tranformation本身不能生成physical operation,仅仅只是影响上一个tranformation是如何和下个Transformation如何进行分配的.类似于SelectTranformation和PartitionTransformation,这些操作没有涉及到数据处理,只是对数据进行分流
  • 其他tranformation组成
  1. SelectTranformation:根据用户提供的SelectName从上游Datastream中选择需要输出到下游的数据
  2. PartitionTransformation: 代表对输入的元素的分区进行改变
  3. UnionTransformation:代表了对多个输入Transformation进行合并
  4. SideOutputTranformation: 代表将根据OutputTag筛选上游DataStream中的数据并发送到下游去
  5. CoFeedbackTransformation: 用于迭代计算中单输入反馈数据流节点的转换操作
  6. FeedbackTransformation: 用于迭代计算中双输入反馈数据节点的转换操作

参考文献

Flink设计与实现:核心原理与源码解析