3.TaskSchedulerImpl
具体实现TaskScheduler,是TaskScheduler的子类,也是整个任务实现过程的核心,在对这部分讲述之前介绍几个比较重要的变量:
taskIdToTaskSetId:HashMap容器,key值为task的Id,value值为TaskSet的Id;
taskIdToExecutorId:HashMap容器,key值为task的Id,value值为executor的Id;
activeExecutorIds:HashSet容器,内容为executor的Id,存储有效的executor
executorsByHost:HashMap容器,key值为host,value值为HashSet,HashSet的内容为该host下的executor的Id
executorIdToHost:HashMap容器,key值为executor的Id,value值为executor所在的host;
它有几个比较重要的方法来实现它的功能:
initialize():创建SchedulerBackend,以及Pool类,实质上我觉得就是为了创建TaskSetManager;
start():调用SchedulerBackend的start方法,启动SchedulerBackend
此外还有取消任务集,任务集完成,更新任务状态等方法,总的来说就是从相应的容器中删除该任务集的记录,然后输出相应的提示消息
submitTasks():提交任务集,异步执行,首先生成任务集管理器--->将任务集管理器存储在名为激活任务集的HashMap容器中--->将任务集管理器添加到SchedulableBuilder中,实质就是添加到线程池中---->若调度器没有再接收任务且任务被装载了(若内存太大或太小,从节点未注册等装载会失败),则调用TimerTask重写的run()方法,其实这个我总觉的没什么很大的意义,只是给出装载任务未成功时的提示,实际上就是调用的是Timer的sched()方法,接着更新接收任务的标志--->调用SchedulerBackend的reviveOffers()方法,这个才是最主要的
<script src="https://code.csdn.net/snippets/645753.js"></script>