Flink作业调度

1.如何进行作业调度

实际上作业调度可以看作是对资源和任务进行匹配的过程。在Flink中,资源是通过slot来表示的,每个slot可以用来执行不同的Task。调度的主要目的就是为了给Task找到匹配的slot。

java实现flink任务调度算法 flink调度流程_执行时间

该图表示的就是flink的作业调度过程,从图中我们可以清晰的看出来一个作业的整个提交调度过程。

master-slave:

AM(AppMaster):master,负责管理整个集群中的资源和作业。

TaskExecutor:slave,负责提供具体的资源并实际执行作业。

Master部分包含3个组件:Dispatcher、ResourceManager和JobManager

(1)Dispatcher负责接收用户提交作业,并且负责为这个新提交的作业拉起一个新的JobManager组件。

(2)ResourceManager负责资源管理。

(3)JobManager负责管理作业的执行,在一个Flink集群中可能有多个作业同时执行,每个作业都有自己的JobManager组件。

作业调度的整个流程:

1.用户提交作业,提交作业会首先启动一个Client进程负责作业的编译和提交。它首先将用户编写的代码编译为一个JobGraph。(还会进行一些检查或者优化工作,例如判断哪些Operator可以Chain到同一个Task中)然后将JobGraph提交到集群中执行,这个时候需要判断当前模式,

(1)若类似Standalone Session模式,AM会预先启动,Client直接与Dispatcher建立连接并提交作业即可。

(2)若是Per-Job模式,AM不会预先启动,Client首先向资源管理系统(如Yarn)申请资源来启动AM,再向Dispatcher提交作业。

以上步骤对应图中的前3步。

2.当作业提交到Dispatcher后,Dispatcer会首先启动一个JobManager组件。图中第4步。

3.JobManager会向ResourceManager申请资源来启动作业中的具体任务。这个时候要看TaskExecutor是否启动。

(1)若类似Standalone Session模式,则RM中已有TaskExecutor注册的资源,可以直接选择空闲的资源进程进行分配。

(2)若是Per-Job模式,RM首先向外部资源管理系统申请启动TM。

对应图中的5,6,7步。

4.RM选择空闲的slot后,通知TM,然后TaskExecutor进行相应的记录后,会向JM进行注册。JM收到TaskExecutor注册的slot后,可以实际提交Task。对应图中的8,9,10步。

5.TM收到JM提交的Task后,会启动一个新的线程,Task启动后,就可以进行预先指定的计算,Task之间可以Shuffle交换数据。

下面解释一下上面提到的两种模式的区别:
(1)Per-Job:独享Dispatcher和ResourceManager,按需要申请资源,适合执行时间较长的大作业。
(2)Session:共享Dispatcher和ResourceManager,共享资源,适合规模小,执行时间短的作业。

2.Flink中按什么顺序调度Task?

Flink调度中总共有两种调度顺序,一种是Eager调度,一种是LAZY_From_Source调度。

(1)Eager调度会在作业启动时申请资源将所有的Task调度起来,主要用来调度可能没有中止的流作业。(Task正常情况下不存在退出结束的行为)

(2)LAZY_From_Source调度是从source开始,按拓扑排序来进行调度,会先调度没有上游任务的source任务。当这些任务完成时,它会将输出数据缓存到内存或者写入磁盘中。对于后续任务,它的前驱任务全部执行完成后,Flink就会将这些任务调度起来。

java实现flink任务调度算法 flink调度流程_flink_02