- JobTracker 功能概述
JobTracker 负责调度 job 的每一个子任务 task 运行于 slave 上,并监控它们,如果发现有失败的 task 就重新运行它 。 JobTracker 一直在等待 JobClient 通过 RPC 提交作业 , 而 TaskTracker 一直通过 RPC 向 JobTracker 发送心跳 heartbeat 询问有没有任务可做,如果有,让其派发任务给它执行。如果 JobTracker 的作业队列不为空 , 则 TaskTracker 发送的心跳将会获得 JobTracker 给它派发的任务。这是一道 pull 过程 : slave 主动向 master 拉生意。 slave 节点的 TaskTracker 接到任务后在其本地发起 Task ,然后执行任务。
- 主节点 接收作业流程
第一步:当 JobClient 向 JobTracker 通信时利用 RPC 调用 JobTracker 的 submitJob() 方法时,首先会生成一个 JobInProgress 类的实例,该实例是为了记录当前这个 Job 任务的执行状况。在构造的同时会调用到 FileSystem ,把在 JobClient 端上传的所有任务文件下载到 本地的文件系统中的临时目录里 。这其中包括上传的 *.jar 文件包、记录配置信息的 xml 、记录分割信息的文件。
第二步:生成的 JobInProgress 实例会加载到作业队列管理器 QueueManager 中,通过 QueueManager 来调度。然后在流程中执行到 jobtracker.initJob() ,再执行 jobinProgress.initTask() ;
第三步: initTask 函数流程中,首先 JobInProgress 会创建 map 的监控对象 , 先针对输入数据的每个 split 创建对应的 Map 执行管理对象 TaskInProgress 。其次 JobInProgress 会创建 Reduce 的监控对象,根据 JobConf 里指定的 Reduce 数目创建,缺省只创建 1 个 Reduce 任务。监控和调度 Reduce 任务的也是 TaskInProgress 类,不过构造方法有所不同。 根据初始化的信息生成每一个 map 与 reduce ,每个 map 与 reduce 都是 TaskInProgress , TaskInProgress 会根据不同参数分别创建具体的 MapTask 或者 ReduceTask 。生成的 map 与 reduce 监控类会被维护在 JobInProgress 实例中。