MapReduce源代码研究1

来源:互联网 发布:淘宝充值平台官网 编辑:程序博客网 时间:2024/04/29 02:05

      今天自己研究hadoop MapReduce 代码,写出来方面以后查阅吧。我研究源代码从main()方法的waitForCompletion()开始研究。

     waitForCompletion()主要作用是Submit the job to the cluster and wait for it to finish.job的运行状态有如下几种方式:

  1.   NEW
  2.   INITED,
  3.   RUNNING,
  4.   SUCCEEDED,
  5.   FAILED,
  6.   KILLED,
  7.   ERROR
      判断完job状态后将提交任务给集群。 submit()负责提交任务给集群,我们主要详细分析submit()方法实现过程。
  1.    判断job状态;
  2.    使用新的API兼容前面的MapReduce API;
  3.    链接集群 使用connect()方法;
  4.    生成一个submitter对象,负责提交job任务;
  5.    调用submitter的内部方法submitJobInternal提交任务;
  6.  调用submitter的内部方法submitJobInternal提交任务;
  7.           submitJobInternal主要实现了如下功能:
    •         检查输入输出规格;
    • 计算输入分块信息;
    •         设置分发任务的用户信息;
    • 拷贝job的jar、配置信息到mapreduce的目录(在hdfs上面);
    •         提交任务给job 给jobtracker并监控他们的状态;

  8. 提交任务是使用的submitClient,中的submitJob,需要三个参数:jobiD,submitJobDir,Credentials(安全认证方法);调用YARNRunner类下的submitJob()函数,提交Job,传出相应的所需参数(例如 JobID等)。
  9. ClientProtocol 是客户端与jobtracker的通信协议;
  10. 提交任务完成
YARNRunner  任务提交代码如下: 
  @Override  public JobStatus submitJob(JobID jobId, String jobSubmitDir, Credentials ts)  throws IOException, InterruptedException {        addHistoryToken(ts);        // Construct necessary information to start the MR AM    ApplicationSubmissionContext appContext =      createApplicationSubmissionContext(conf, jobSubmitDir, ts);    // Submit to ResourceManager    try {      ApplicationId applicationId =          resMgrDelegate.submitApplication(appContext);      ApplicationReport appMaster = resMgrDelegate          .getApplicationReport(applicationId);      String diagnostics =          (appMaster == null ?              "application report is null" : appMaster.getDiagnostics());      if (appMaster == null          || appMaster.getYarnApplicationState() == YarnApplicationState.FAILED          || appMaster.getYarnApplicationState() == YarnApplicationState.KILLED) {        throw new IOException("Failed to run job : " +            diagnostics);      }      return clientCache.getClient(jobId).getJobStatus(jobId);    } catch (YarnException e) {      throw new IOException(e);    }  }
  • 设置必要的配置信息,初始化Application上下文信息,其中上下文信息中包括MRAppMaster所需要的资源,执行MRAppMaster的命令得等。
  • 然后调用ResourceMgrDelegate的submitApplication()方法,同时传入Application上下文信息,提交Job到ResourceManager,函数执行最后返回已生成的ApplicationId(实际生成JobID的时候ApplicationId就已经生成)。
  • 最后返回Job此时的状态,函数退出



需要继续了解split和RPC通信协议。

0 0