先看入口 JobClient.runJob(conf);这个函数,之后submitJob,最后调用submitJobInternal方法,接下来看这个方法
接下来就看jobTracker的submitJob方法
首先构造了一个处理中的job,JobInProgress job = new JobInProgress(jobId, this, this.conf);
该构造函数主要是把一些jar包拷到本地,并且设置一些任务属性。接下来是一系列合法性校验
1 任务对应的队列是否存在
2 权限检查
3 内存检查
如果校验不通过则加入到清理队列,销毁该任务,同时抛出异常
接受调用 private synchronized JobStatus addJob(JobID jobId, JobInProgress job) 方法
该方法主要是通过EagerTaskInitializationListener的jobAdded方法
jobInitQueue.add(job); 加入初始化队列
resortInitQueue(); 根据优先级和创建时间排序
这样客户端的任务就提交成功了
接下来的任务就是怎么把该job拆分成Task
很明显肯定是一个线程去处理这个初始化队列,把job转换成task,接下来具体看
EagerTaskInitializationListener这个类,它有以下内部类 JobInitManager管理JobInit,InitJob负责job分割成任务
接下来看JobTracker的initJob方法,主要是调用了JobInProgress 的initTasks方法
该方法主要是把job拆分成很多的TaskInProgress 包括map reduce任务
回过来看是谁启动了初始化job的线程,看EagerTaskInitializationListener的start方法,以后台线程的形式跑初始化job
接下来看最最开始的入口jobTracker的offerService方法
接下来主要就是看 taskScheduler.start();了,主要有LimitTasksPerJobTaskScheduler JobQueueTaskScheduler和TaskScheduler 后者是前者的父类,最后在JobQueueTaskScheduler的start方法中启动了 eagerTaskInitializationListener.start();即启动的分割job的线程