MapReduce1.0作业提交过程

MapReduce1.0作业提交过程

  1. 客户端提交MapReduce程序到Job,job的submit()方法,创建一个JobSummiter实例,并且调用其submitJobInternal()方法。
    注:jobtracker是一个java应用程序,它的主类是JobTracker。
  2. Job会向jobtracker请求作业ID(通过调用JobTracker的getnewJobId()方法获取)。接下来它会做检查操作,这个检查就是确定输出目录是否存在,如果存在那么Job就不能正常运行,jobtracker会抛出错误给客户端,接下来还要检查输入目录是否存在,如果不存在同样抛出错误,如果存在jobtracker会根据输入计算输入计算输入分片(Input Split),如果分片计算不出来也会抛出错误。一切正常jobtracker就会配置Job需要的资源了。
  3. 将运行所需要的资源复制到一个以作业id命名的目录下jobtracker的文件系统中。
  4. 告知jobtracker作业准备执行(通过调用JobTrack的submitJob()方法实现)
  5. 分配好资源后,jobtracker就会初始化作业,初始化主要做的是将Job放入一个内部的队列,交给作业调度器(job scheduler)进行调度,作业调度器会初始化这个Job,初始化就是创建一个正在运行的Job对象,以便跟踪任务的状态和进程。
  6. 为了创建任务运行列表,作业调度器首先从共享文件系统中获取客户端已经计算好的输入分片,然后每个分片创建一个map任务。创建的reduce任务的数量由Job的mapred.reduce.tasks属性决定。
  7. 任务分配, tasktracker会运行一个简单的循环来定期发送心跳(heartbeat)给jobtracker,jobtracker可以监控tasktracker是否存活,也可以获取tasktracker处理的状态和问题。同时tasktracker也可以通过心跳里的返回值获取jobtracker给它的操作指令。
  8. 任务执行。第一步,通过从共享文件系统把作业的jar文件复制到tasktracker所在的文件系统,实现jar文件本地化。同时,tasktracker将应用程序所需要的全部文件从分布式缓存复制到本地磁盘。第二步,tasktracker为任务新建一个本地工作目录,并把jar解压到该文件夹下。第三步,tasktracker新建一个TaskRunner实例来运行。
  9. TaskRunner启动一个新的JVM来运行每个任务,以便用用户定义的map和reduce函数的任何软件问题都不会影响到tasktracker。