许久没有写博客了,没有太多时间,最近陆续将Spark源码的一些阅读笔记传上,接下来要修改Spark源码了。
这个类继承于TaskScheduler类,重载了TaskScheduler中的大部分方法,是Task调度的实际操作。
1、检测推测执行间隔,最大响应时间,每个task的CPU数。
2、指定调度模式SchedulingMode。
3、setDAGScheduler:设置任务调度的对象DAGScheduler。
4、initialize:初始化backend接口和资源池pool,并给资源池配置调度模式,FIFO或者Fair。Backend接口是TaskScheduler与底层资源管理器(如Mesos)交互的接口。
5、获取任务ID。
6、start:主要启动backend接口,检查是否是本地执行,检查是否启动推测执行(如果是就需要启动推测执行的线程)。
7、postStartHook:与start保持同步,等待backend准备好。
8、submitTasks:根据参数中的taskSet(即stage中的一群task)将task提交给集群中执行的UI,惯例先要检查是否是本地执行。
9、cancelTasks:根据stageId来取消任务,也就是取消stage。如果有任务已经运行,要先杀死任务再丢弃stage,否则直接丢弃stage。
10、taskSetFinished:当所有的任务都执行完成后,设置任务执行为完成,并清除其与TaskSetManager的联系。
11、resourceOffers:资源分配的重要方法。首先将各个可活动的节点和executor的地址都标记,添加executor时也要重新标记;然后,为第一次循环做准备,即获取已分配的任务、可用CPU数、排队的task;嵌套循环,循环标准为两个,排队的task和位置优先级,前者为每一个在等待的task,后者为最低优先级到task所标注的优先级;内部执行的操作也是一个循环,当有CPU可用时的while循环;while循环内是一个for循环,用来遍历所有的executor;for循环内部为一个for循环,用来遍历匹配task和executor。
注:优先级为Any、Rack_Local、No_PREF、NODE_LOCAL、PROCESS_LOCAL。
12、statusUpdate:更新各个task的状态,实际上是遍历所有的task,然后根据其TaskSet中记录的值来判断Task的状态。
13、executorHeartbeatReceived:重载心跳接收函数。
14、结果处理函数:handle**函数,用来处理任务运行结果、成功的任务、失败的任务等等;error函数,用来处理失败的错误报告;stop函数,用来关闭backend接口和任务结果接收的接口。
15、checkSpeculatableTasks:检查资源池中是否有需要启动推测执行的task,如果有则需要重新启动offers。
16、executorLost:处理失败的executor,打印错误信息。
17、removeExecutor:移除executor并标记其丢失。
18、waitBackendReady:等待backend接口准备好。
19、类TaskSchedulerImpl:对map按值的数量排序,然后建立索引。