任务的提交与分配过程涉及到几个比较重要和复杂的类,在了解调度的细节之前,先介绍如下的这几个类。
1.TaskScheduler类和TasksShedulerImpl
TaskScheduler本身是Trait类,TaskSchedulerImpl类是TaskScheduler类的子类。TaskSchedulerImpl类主要负责三项工作:一是在submitTasks方法中,接收来自DAGScheduler提交的任务集,不同阶段的任务集构造成一棵调度树(Schedulable Tree);二是决定某个任务具体应该分配给集群中的哪一个Worker节点,三是TaskSchedulerImpl类内部包含一个SchedulerBackend类(实际上是其子类)的实例,在submitTasks方法中将会调用SchedulerBackend实例提供的接口,将任务交付给具体的Executor去执行。
2.调度树相关类
第一个调度树相关类是Schedulable类,该类被用于表示任务集调度树上的每一个调度节点。每一个实例内部都会包含节点名、孩子节点列表、选择的调度算法,节点优先级等属性值,以及提供方法用于在子节点列表中添加和删除孩子节点、获得根据调度算法已经排好序的子节点列表等方法。Shedulable类是Trait类,其有两个子类实现,分别是Pool类和TaskSetManager类,Pool类并不存储具体的任务集,其在调度树中用于表示TaskSetManager和Pool对象的集合,而TaskSetManager则包含具体的任务集,除了参与调度过程之外,TaskSetManager内部还能监控每个正在运行中的任务,对执行失败的任务执行重试操作等。(www.xing528.com)
第二个调度树相关类是SchedulableBuilder类,该类被用于构建和维护一棵调度树。SchedulableBuilder类同样是Trait类,根据选择调度算法的不同,有两种实现,分别对应FIFOSchedulableBuilder类和FairSchdulableBuilder类,
3.调度后台类
SchedulerBackend类之前已经在7.2小节接触过,该类的实例为TaskSchedulerImpl对象提供集群中执行器的相关信息,使得TaskSchedulerImpl能够根据执行器的位置信息进行任务调度。SchedulerBackend类根据Spark是以集群还是本地方式运行,以及集群管理器的类型的不同,有着不同的实现,这里主要关注集群调度中的CoarseGrainedClusterBackend类。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。