Flink任务调度原理之并行度与任务链

一、并行度

上一篇已经讲到了DataFlow与执行图,细心的小伙伴应该会发现为什么有些算子生成执行图时是两个,有些是一个呢?如果你注意到了这些证明你是真的很闲!!!好了为了看得更加明显先上图:
在这里插入图片描述
上面所描述的的也就是并行度!!!

1.1 什么是并行度

一个特定算子的 子任务(subtask)的个数被称之为其并行度(parallelism)。一般情况下,一个 stream 的并行度,可以认为就是其所有算子中最大的并行度。

1.2 详解并行度

JobGraph中展示了A算子并行度为4,C为2等等。而他在TaskManager详细执行如下图:
在这里插入图片描述

  • 一个程序中,不同的算子可能具有不同的并行度
  • 算子之间传输数据的形式可以是 one-to-one (forwarding) 的模式也可以是redistributing 的模式,具体是哪一种形式,取决于算子的种类
  • One-to-one:stream维护着分区以及元素的顺序(比如A和B的关系)。这意味着B算子的子任务看到的元素的个数以及顺序跟 A子的子任务生产的元素的个数、顺序相同。map、fliter、flatMap等算子都是one-to-one的对应关系。
  • Redistributing:stream的分区会发生改变(比如图中的C和D的关系)。每一个算子的子任务依据所选择的transformation发送数据到不同的目标任务。例如,keyBy 基于 hashCode 重分区、而 broadcast 和 rebalance 会随机重新分区,这些算子都会引起redistribute过程,而 redistribute 过程就类似于 Spark 中的 shuffle 过程。

二、任务链

2.1 什么是任务链

上面讲到了并行度one-to-one(A和B的关系),他们之间数据是一对一的,而而不像C和D的关系,那我们为什么不把他们组合在一起发送到同一台机器上去执行?这样不就避免了机器之间的通信开销吗?聪明!

2.2 详解任务链

为了更加清晰,先上图:
在这里插入图片描述

  • Flink 采用了一种称为任务链的优化技术,可以在特定条件下减少本地通信的开销。为了满足任务链的要求,必须将两个或多个算子设为相同的并行度,并通过本地转发(local forward)的方式进行连接
  • 相同并行度的 one-to-one 操作,Flink 这样相连的算子链接在一起形成一个 task,原来的算子成为里面的 subtask
  • 并行度相同、并且是 one-to-one 操作,两个条件缺一不可

猜你喜欢

转载自blog.csdn.net/qq_39657909/article/details/106005264
今日推荐