Flink原理(三)——Task(任务)、Operator Chain(算子链)和Slot(资源)

本文是参考官方文档结合本身的理解写的,所引用文献均已指明来源,若侵权请留言告知,我会立马删除。此外,如果表达欠妥的地方,欢迎大伙留言指出。html


前言apache

  在上一篇博客Flink原理(二) ——资源一文中已简要说了在Flink集群中资源的分配状况,这篇博客尝试从定义算子以后,任务是如何分配的,以及任务是如何使用资源的。app

1、Task和Operator Chains

  Flink会在生成JobGraph阶段,将代码中能够优化的算子优化成一个算子链(Operator Chains)以放到一个task(一个线程)中执行,以减小线程之间的切换和缓冲的开销,提升总体的吞吐量和延迟。下面以官网中的例子进行说明,以下图1所示:优化

   图中,source、map、[keyBy|window|apply]、sink算子的并行度分别是二、二、二、二、1,通过Flink优化后,source和map算子组成一个算子链,做为一个task运行在一个线程上,其简图如图中condensed view所示,并行图如parallelized view所示。算子之间是否能够组成一个Operator Chains,看是否知足如下条件:spa

  • 上下游算子的并行度一致
  • 下游节点的入度为1 
  • 上下游节点都在同一个 slot group 中
  • 下游节点的 chain 策略为 ALWAYS(能够与上下游连接,map、flatmap、filter等默认是ALWAYS)
  • 上游节点的 chain 策略为 ALWAYS 或 HEAD(只能与下游连接,不能与上游连接,Source默认是HEAD)
  • 两个节点间数据分区方式是 forward
  • 用户没有禁用 chain(代码中是否配置disableChain())
  【如果对这里还有疑惑,能够参看 Operator Chains一文】

2、Task slot和resource

  结合以前资源一文,咱们能够得知上文中的任务在Flink集群中的分布应以下图2所示:

   图中,有两个节点(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。进程

 
  综上所述,算子被定义后,先根据条件优化算子链 ,而后组成一个个subtask,最后根据是否能够共享slot分布在taskManager的slot中执行。其中细节,且听下回分解。
 
 Ref:
相关文章
相关标签/搜索