首页 理论教育 如何实现任务集调度?

如何实现任务集调度?

时间:2023-06-21 理论教育 版权反馈
【摘要】:紧接着,SchedulableBuilder将TaskSetManager对象添加到调度树中使其成为一个叶子节点,以实现任务集之间的调度,跳过一些中间过程,在最后,submitTasks调用了CoarseGrainedClusterBackend类提供的reviveOffers方法,开始向集群中的执行器分派任务。resourceOffers函数会对所有的机架、主机、执行器以及其相互之间的对应关系进行登记,为了防止任务总是被分配在一个节点,程序会打散所有的执行器,随机重排,并统计可用的CPU核心数目。任务的分配工作到此完成。

如何实现任务集调度?

接下来具体讨论任务调度的过程,其实现在TaskSchedulerImpl.submitTasks方法中,代码如下。

submitTasks方法先提取出任务集,将任务集封装到TaskSetManager类中,以实现任务集的管理以及任务集内部的调度。紧接着,SchedulableBuilder将TaskSetManager对象添加到调度树中使其成为一个叶子节点,以实现任务集之间的调度,跳过一些中间过程,在最后,submitTasks调用了CoarseGrainedClusterBackend类提供的reviveOffers方法,开始向集群中的执行器分派任务。

CoarseGrainedClusterBackend类的reviveOffers方法会向DriverActor发送一条ReviveOffers消息,从而调用CoarseGrainedClusterBackend类的launchTask方法来启动任务,其实现代码如下。

submitTasks方法先提取出任务集,将任务集封装到TaskSetManager类中,以实现任务集的管理以及任务集内部的调度。紧接着,SchedulableBuilder将TaskSetManager对象添加到调度树中使其成为一个叶子节点,以实现任务集之间的调度,跳过一些中间过程,在最后,submitTasks调用了CoarseGrainedClusterBackend类提供的reviveOffers方法,开始向集群中的执行器分派任务。

CoarseGrainedClusterBackend类的reviveOffers方法会向DriverActor发送一条ReviveOffers消息,从而调用CoarseGrainedClusterBackend类的launchTask方法来启动任务,其实现代码如下。

代码中的scheduler即为上文所说的TaskSchedulerImpl对象,在启动任务集之前,程序先要向TaskSchedulerImpl的resourceOffers方法传递所有的执行器的相关信息,从而得到调度后的任务描述TaskDescription的集合,TaskDescription内包含任务的编号和对应执行器的编号等信息。(www.xing528.com)

resourceOffers函数会对所有的机架、主机、执行器以及其相互之间的对应关系进行登记,为了防止任务总是被分配在一个节点,程序会打散所有的执行器,随机重排,并统计可用的CPU核心数目。在为执行器分配任务前,会从调度树的根节点中得到调度完毕的任务集序列,接下来便是多重循环,最外层循环是所有任务集和所有允许的最大位置资源限制,第二层循环是所有可用执行器,最里层循环是当前任务集内部,所有满足位置资源的任务集,循环的细节可参看TaskSchedulerImpl.resourceOffer类的实现,在此不进行细述。

resourceOffers会把所有已经分配好执行器的任务返回给CoarseGrainedClusterBackend,CoarseGrainedClusterBackend调用launchTasks方法运行任务,launchTasks方法将任务内容序列化,确保序列化后的大小小于某个限制,最后向特定的执行器发送任务。任务的分配工作到此完成。

代码中的scheduler即为上文所说的TaskSchedulerImpl对象,在启动任务集之前,程序先要向TaskSchedulerImpl的resourceOffers方法传递所有的执行器的相关信息,从而得到调度后的任务描述TaskDescription的集合,TaskDescription内包含任务的编号和对应执行器的编号等信息。

resourceOffers函数会对所有的机架、主机、执行器以及其相互之间的对应关系进行登记,为了防止任务总是被分配在一个节点,程序会打散所有的执行器,随机重排,并统计可用的CPU核心数目。在为执行器分配任务前,会从调度树的根节点中得到调度完毕的任务集序列,接下来便是多重循环,最外层循环是所有任务集和所有允许的最大位置资源限制,第二层循环是所有可用执行器,最里层循环是当前任务集内部,所有满足位置资源的任务集,循环的细节可参看TaskSchedulerImpl.resourceOffer类的实现,在此不进行细述。

resourceOffers会把所有已经分配好执行器的任务返回给CoarseGrainedClusterBackend,CoarseGrainedClusterBackend调用launchTasks方法运行任务,launchTasks方法将任务内容序列化,确保序列化后的大小小于某个限制,最后向特定的执行器发送任务。任务的分配工作到此完成。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈