hadoop作业执行流程及代码简略解读之三JobTracker

来源:互联网 发布:服务器数据丢失 编辑:程序博客网 时间:2024/06/17 04:45

5.JobTracker
        JobTracker是在网络环境中提交及运行MR任务的核心位置。
5.0 JobTracker启动
       JobTracker类中有一个main()函数,hadoop启动的时候执行此main()函数启动JobTracker进程,main()中生成一个JobTracker的对象,然后通过tracker.offerService()语句启动服务,即启动一些线程:
       1.taskScheduler:一个抽象类,被JobTracker用于安排执行在TaskTrackers上的task任务,它使用一个或多个JobInProgressListeners接收jobs的通知。另外一个任务是调用JobInProgress.initTask()为job初始化tasks。启动,提交作业,设置配置参数,终止等方法。
       2.completedJobsStoreThread对应completedJobStatusStore;CompletedJobStatusStore类:把JobInProgress中的job信息存储到DFS中;提供一些读取状态信息的方法;是一个守护进程,用于删除DFS中的保存时间超过规定时间的job status删除。
       3.interTrackerServer,抽象类Server类型的实例。一个IPC (Inter-Process Communication,进程间通信)服务器,IPC调用一个以一个参数的形式调用Writable,然后返回一个Writable作为返回值,在某个端口上运行。提供了call,listener,responder,connection, handle类。包括start(),stop(),join(),getListenerAddress(),call()等方法。

       job是统一由JobTracker来调度的,把具体的Task分发给各个TaskTracker节点来执行。下面来详细解析执行过程,首先先从JobTracker收到JobClient的提交请求开始。
5.1 JobTracker.submitJob(JobID)
      1.创建JobInProgress用于跟踪和调度这个job。维护着这个job的所有信息。
      JobInProgress在创建的时候会初始化一系列与任务有关的参数,调用到FileSystem,把在JobClient端上传的所有任务文件下载到本地的文件系 统中的临时目录里。这其中包括上传的*.jar文件包、记录配置信息的xml、记录分割信息的文件。
      2.检查这个job的操作是否可以执行
      3.检查集群内存是否允许运行这个job
      4.调用jobAdd(JobID,JobInProgress)将这个作业添加到jobs队列中

5.2 JobTracker.jobAdd(JobID,JobInProgress)
      1.调用监听器类EagerTaskInitializationListener将作业加入到jobInitQueue队列中。
               1.JobTracker 中的监听器组EagerTaskInitializationListener负责任务Task的初始化.JobTracker使用jobAdded(job)加入job到EagerTaskInitializationListener中一个专门管理需要初始化的队列里,即一个list成员变量jobInitQueue里。resortInitQueue 方法根据作业的优先级排序。然后调用notifyAll()函数,会唤起一个用于初始化job的线程JobInitManager来处理。
               2.其中的另一个监听器JobQueueJobInProgressListener用于调度作业执行。在这里为这个作业创建一个作业调度信息并一起放入到job队列中等待调度。

      2.JobInitManager
      JobInitManager收到信号后即取出最靠前的job,即优先级别最高的job,通过线程池开始进行真正调度。调度是通过调用JobInProgress.initTasks()实现。
5.3 JobInProgress.initTasks() 初始化MR任务
      任务Task分两种: MapTask 和reduceTask,它们的管理对象都是TaskInProgress 。
      1.读取分片、得到分片数目
       调用JobClient的readSplitFile()获得已分解的输入数据的RawSplit列表,然后根据这个列表创建对应数目的Map执行管理对象TaskInProgress。在这个过程中,还会记录该RawSplit块对应的所有在HDFS里的blocks所在的DataNode节点的host,这个会在RawSplit创 建时通过FileSplit的getLocations()函数获取,该函数会调用DistributedFileSystem的getFileCacheHints()获得。当然如果是存储在本地文件系统中,即使用LocalFileSystem时当然只有一个location即“localhost”了。
      2.计算job的任务数是否超出限制,超出则不可执行。否则下一步
      3.首先JobInProgress会创建Map的监控对象。在initTasks()函数里通过建TaskInProgress对象数组实现。并且对对象数组初始化。
      4.initTasks()方法会通过createCache()方法为这些TaskInProgress对象产生一个未执行任务的Map缓存nonRunningMapCache。slave端的 TaskTracker向master发送心跳时,就可以直接从这个cache中取任务去执行。
      5.JobInProgress会创建Reduce的监控对象,这个比较简单,根据JobConf里指定的Reduce数目创建,缺省只创建1个Reduce任务。监控和调度Reduce任务的是TaskInProgress类,不过构造方法有所不同,TaskInProgress会根据不同参数分别创建具体的MapTask或者 ReduceTask。同样地,initTasks()也会通过createCache()方法产生nonRunningReduces成员。
      6.JobInProgress创建完TaskInProgress后,最后构造JobStatus并记录job正在执行中,然后再调用JobHistory.JobInfo.logStarted()记录job的执行日志。到这里JobTracker里初始化job的过程全部结束。
5.4JobTracker调度Job
      0.hadoop默认的调度器是FIFO策略的JobQueueTaskScheduler,它有两个成员变量 jobQueueJobInProgressListener与上面说的eagerTaskInitializationListener。JobQueueJobInProgressListener是JobTracker的另一个监听器类,它包含了一个映射,用来管理和调度所有的JobInProgress。jobAdded(job)同时会加入job到JobQueueJobInProgressListener中的映射。
      1.JobQueueTaskScheduler.assignTasks(TaskTrackerStatus) ,他实现了工作调度。
      1.JobTracker 接到TaskTracker 的heartbeat() 调用后,首先会检查上一个心跳响应是否完成,是没要求启动或重启任务,如果一切正常,则会处理心跳。首先它会检查 TaskTracker 端还可以做多少个 map 和 reduce 任务,将要派发的任务数是否超出这个数,是 否超出集群的任务平均剩余可负载数。如果都没超出,则为此 TaskTracker 分配一个 MapTask 或 ReduceTask 。 
       2.产生 Map 任务使用 JobInProgress 的 obtainNewMapTask() 方法,实质上最后调用了 JobInProgress 的 findNewMapTask() 访问 nonRunningMapCache 。
       上面讲解任务初始化时说过,createCache()方法会在网络拓扑结构上挂上需要执行的TaskInProgress。findNewMapTask()从近到远一层一层地寻找,首先是同一节点,然后在寻找同一机柜上的节点,接着寻找相同数据中心下的节点,直到找了maxLevel层结束。这样的话,在 JobTracker给TaskTracker派发任务的时候,可以迅速找到最近的TaskTracker,让它执行任务。
      3.最终生成一个Task类对象,该对象被封装在一个LanuchTaskAction 中,发回给TaskTracker,让它去执行任务。

      4.产生 Reduce 任务过程类似,使用 JobInProgress.obtainNewReduceTask() 方法,实质上最后调用了 JobInProgress 的 findNewReduceTask() 访问 nonRunningReduces。

原创粉丝点击