task之间传输数据方式、操作链和任务槽
task之间传输数据方式
task之间数据传递有四种方式
- forward strategy
- key-based strategy
- broadcast strategy
- random strategy
forward strategy
即转发策略: 一个task的输出只发送给一个task作为输入
优点
- 如果两个task都在一个JVM中的话,那么就可以避免网络开销
key-based strategy
即基于键值的策略
- 数据需要按照某个属性(我们称为 key)进行分组(或者说分区)
- 相同key的数据需要传输给同一个task,在一个task中进行处理
broadcast strategy
即广播策略
- 数据随机的从一个task中传输给下一个operator所有的subtask。因为这种策略涉及数据复制和网络通信,所以成本相当高。
random strategy
即随机策略
- 数据随机的从一个task中传输给下一个operator所有的subtask
- 保证数据能均匀的传输给所有的subtask,以便在任务之间均匀地分配负载
注意
转发与随机策略是基于key-based策略的;转发策略和随机策略也可以看作是基于键的策略的变体,其中前者保存上游元组的键,而后者执行键的随机重新分配
操作链
操作链即任务链(不同场景下称呼不同)是将相关性很强的transformation操作绑定在一起,这样能够让转换过程中上下游的 Task 在同一个 Pipeline 中执行,进而避免因为数据在网络或者线程间传输导致的开销,提高整体的吞吐量和延迟。
如下图所示:将身处同一个TaskManager的key agg
和sink
绑定到一起。从而使原来的4个task变为2个task
任务链类似于spark中的管道,spark将同一分区、同一债依赖的task分配给一个task执行。
任务链的优点
- 减少线程之间的切换
- 减少消息的序列化、反序列化
- 减少数据在缓冲区的交换
- 减少了延迟的同时提高吞吐量
任务链开启的条件
- 数据传输策略是 forward strategy,即one-to-one,算子不会改变分区
- map、flatmap、filter等算子都是one-to-one
- 上下游算子的并行度相同
- 在同一个TaskManager中运行
- 用户没有禁用chain
任务链的关闭
- 关闭整个任务链:disableOperatorChaining
//执行此API会关闭任务链
StreamExecutionEnvironment.disableOperatorChaining()
- 关闭指定算子的任务链:disableChaining
//关闭filter算子的合并任务链
import org.apache.flink.api.scala._
val dataStre