本文是参考官方文档结合本身的理解写的,所引用文献均已指明来源,若侵权请留言告知,我会立马删除。此外,如果表达欠妥的地方,欢迎大伙留言指出。html
前言apache
在上一篇博客Flink原理(二) ——资源一文中已简要说了在Flink集群中资源的分配状况,这篇博客尝试从定义算子以后,任务是如何分配的,以及任务是如何使用资源的。app
Flink会在生成JobGraph阶段,将代码中能够优化的算子优化成一个算子链(Operator Chains)以放到一个task(一个线程)中执行,以减小线程之间的切换和缓冲的开销,提升总体的吞吐量和延迟。下面以官网中的例子进行说明,以下图1所示:优化
图中,source、map、[keyBy|window|apply]、sink算子的并行度分别是二、二、二、二、1,通过Flink优化后,source和map算子组成一个算子链,做为一个task运行在一个线程上,其简图如图中condensed view所示,并行图如parallelized view所示。算子之间是否能够组成一个Operator Chains,看是否知足如下条件:spa
图中,有两个节点(TaskManage,即两个进程),每一个节点中有3个slot,每个task(一个Thread)均跑在一个slot中。线程
但实际上,Flink在默认状况下,只要子任务是来自同一个Job,是容许子任务(subtask,就是相似source/map、window等)共享一个slot的,即便是不一样任务的子任务也是能够共享一个slot。这样有两个好处:3d
1) 一个Job的最高并行度就是Flink集群中slot的个数,这样咱们就不须要计算一个程序能够包含多个task;htm
2) 能够得到更好的资源利用率。若没有slot共享,像source/map这种不是很是耗资源的算子(官网上是说非资源密集型、non-intensive)就和window这种很是耗资源的算子占用相同多的资源(一个slot),如图2所示;若容许slot共享,则图2中集群最大的并行度可为6,以下图3所示:blog
在能够共享slot的状况下,较耗资源的subtask就能够比较均匀的分布在Flink集群中的taskManager上。什么意思了?如图3,相似window的算子均匀的分布在每一个slot中,而图2中,仅在两个slot中。从图3中咱们也能够看出一个slot中能够运行多个Thread。进程