mapreduce job提交流程源码级分析(二)(原创)这篇文章说到了jobSubmitClient.submitJob(jobId, submitJobDir.toString(), jobCopy.getCredentials())提交job,最终调用的是JobTracker.submitJob;而这篇文章JobTracker启动流程源码级分析则是分析的JobTracker的启动过程,JobTracker启动之后就会等待提交作业管理作业等。

  接下来看看JobTracker.submitJob方法,调用这个方法之前已经将相关的资源分片信息、配置信息、外部文件、第三方jar包、一些归档文件以及job.jar上传到HDFS中了。

  public JobStatus submitJob(JobID jobId, String jobSubmitDir, Credentials ts)
throws IOException {
JobInfo jobInfo = null;
UserGroupInformation ugi = UserGroupInformation.getCurrentUser();
synchronized (this) {
if (jobs.containsKey(jobId)) {
// job already running, don't start twice
return jobs.get(jobId).getStatus();
}
jobInfo = new JobInfo(jobId, new Text(ugi.getShortUserName()),
new Path(jobSubmitDir));
} // Create the JobInProgress, do not lock the JobTracker since
// we are about to copy job.xml from HDFS
//当JobTracker接收到新的job请求(即submitJob()函数被调用)后,
//会创建一个JobInProgress对象并通过它来管理和调度任务。
//JobInProgress在创建的时候会初始化一系列与任务有关的参数,调用到FileSystem,
//把在JobClient端上传的所有任务文件下载到本地的文件系统中的临时目录里。这其中包括上传的*.jar文件包、
//记录配置信息的xml、记录分割信息的文件。
JobInProgress job = null;
try {
job = new JobInProgress(this, this.conf, jobInfo, 0, ts);
} catch (Exception e) {
throw new IOException(e);
} synchronized (this) {
// check if queue is RUNNING
String queue = job.getProfile().getQueueName();
if (!queueManager.isRunning(queue)) {
throw new IOException("Queue \"" + queue + "\" is not running");
}
try {
aclsManager.checkAccess(job, ugi, Operation.SUBMIT_JOB);
} catch (IOException ioe) {
LOG.warn("Access denied for user " + job.getJobConf().getUser()
+ ". Ignoring job " + jobId, ioe);
job.fail();
throw ioe;
} // Check the job if it cannot run in the cluster because of invalid memory
// requirements.
try {
checkMemoryRequirements(job);
} catch (IOException ioe) {
throw ioe;
}
boolean recovered = true; // TODO: Once the Job recovery code is there,
// (MAPREDUCE-873) we
// must pass the "recovered" flag accurately.
// This is handled in the trunk/0.22
if (!recovered) {
// Store the information in a file so that the job can be recovered
// later (if at all)
Path jobDir = getSystemDirectoryForJob(jobId);
FileSystem.mkdirs(fs, jobDir, new FsPermission(SYSTEM_DIR_PERMISSION));
FSDataOutputStream out = fs.create(getSystemFileForJob(jobId));
jobInfo.write(out);
out.close();
} // Submit the job
JobStatus status;
try {
status = addJob(jobId, job);
} catch (IOException ioe) {
LOG.info("Job " + jobId + " submission failed!", ioe);
status = job.getStatus();
status.setFailureInfo(StringUtils.stringifyException(ioe));
failJob(job);
throw ioe;
} return status;
}
}

  一、首先看看jobs中有无要提交的Job,jobs是一个Map<JobID, JobInProgress> 这里存储着所有已知的Job及其对应的JobInProgress信息。如果已经存在这个Job则直接返回这个Job的状态;如果不存在则利用JobID和jobSubmitDir构造一个JobInfo对象,JobInfo类实现了Writable可以被序列化,而且存储三个字段JobID、user、以及上传资源的目录jobSubmitDir;

  二、创建一个JobInProgress对象,JobInProgress类主要用于监控和跟踪作业运行状态,存在于作业的整个运行过程中,并为调度器提供最底层的调度接口,维护了两部分信息:一种是静态信息这些在作业提交之时就确定好了;另一种是动态的会随着作业的运行而动态变化的。job = new JobInProgress(this, this.conf, jobInfo, 0, ts),这里会创建一个JobProfile一直跟踪作业的运行,不管作业作业活着还是死了;

  三、checkMemoryRequirements(job)检查Job是否有无效的内存需求而不能运行,检查JobTracker的配置有无问题,再检查Job的内存配置有无问题;

  四、是否存储作业信息以备恢复。在1.0.0版本中这还没实现(在这就是没存储信息),要存的信息是一个JobInfo对象存储着作业的存储目录、ID以及user。

  五、status = addJob(jobId, job)这是核心的提交方法。会将此Job放入jobs中,jobs保存着JobTracker所有运行作业的对应关系<jobID,JobInProgress>;然后让所有的JobInProgressListener监听这个Job,根据JobTracker启动流程源码级分析 中可以知道这些JobInProgressListener实例都是通过调度器初始化(JobQueueTaskScheduler.start()方法)时,有俩线程一个是监控Job生命周期的,一个是对新加入的Job初始化的;一个监控Job的整个生命周期;然后加入监控统计中,返回job状态job.getStatus()。

  这样Job的提交过程就完了,剩下的就是作业的调度分配及监控了。后续再讲吧

参考:

  董西成,《Hadoop技术内幕:深入解析MapReduce架构设计与实现原理》

mapreduce job提交流程源码级分析(三)的更多相关文章

  1. mapreduce job提交流程源码级分析(一)(原创)

    首先,在自己写的MR程序中通过org.apache.hadoop.mapreduce.Job来创建Job.配置好之后通过waitForCompletion方法来提交Job并打印MR执行过程的log.H ...

  2. mapreduce job提交流程源码级分析(二)(原创)

    上一小节(http://www.cnblogs.com/lxf20061900/p/3643581.html)讲到Job. submit()方法中的: info = jobClient.submitJ ...

  3. MapReduce之Job提交流程源码和切片源码分析

    hadoop2.7.2 MapReduce Job提交源码及切片源码分析 首先从waitForCompletion函数进入 boolean result = job.waitForCompletion ...

  4. Spark3.0YarnCluster模式任务提交流程源码分析

    1.通过spark-submit脚本提交spark程序 在spark-submit脚本里面执行了SparkSubmit类的main方法 2.运行SparkSubmit类的main方法 3.调用doSu ...

  5. JobTracker启动流程源码级分析

    org.apache.hadoop.mapred.JobTracker类是个独立的进程,有自己的main函数.JobTracker是在网络环境中提交及运行MR任务的核心位置. main方法主要代码有两 ...

  6. TaskTracker启动过程源码级分析

    TaskTracker也是作为一个单独的JVM来运行的,其main函数就是TaskTracker的入口函数,当运行start-all.sh时,脚本就是通过SSH运行该函数来启动TaskTracker的 ...

  7. MapReduce的MapTask任务的运行源码级分析

    TaskTracker任务初始化及启动task源码级分析 这篇文章中分析了任务的启动,每个task都会使用一个进程占用一个JVM来执行,org.apache.hadoop.mapred.Child方法 ...

  8. MapReduce job在JobTracker初始化源码级分析

    mapreduce job提交流程源码级分析(三)中已经说明用户最终调用JobTracker.submitJob方法来向JobTracker提交作业.而这个方法的核心提交方法是JobTracker.a ...

  9. 监听器初始化Job、JobTracker相应TaskTracker心跳、调度器分配task源码级分析

    JobTracker和TaskTracker分别启动之后(JobTracker启动流程源码级分析,TaskTracker启动过程源码级分析),taskTracker会通过心跳与JobTracker通信 ...

随机推荐

  1. [转载] 彻底学习STL中的Allocator

    原文: http://cissco.iteye.com/blog/379093 帮助我们理解allocator的原理 Allocator是C++语言标准库中最神秘的部分之一.它们很少被显式使用,标准也 ...

  2. nodejs学习笔记<四>处理请求参数

    在web开发中处理请求参数是个非常常见的工作:nodejs提供了了querystring用来处理请求参数. querystring常用方法有:parse,stringify. (1)parse: 解析 ...

  3. python仿微软记事本

    # -*- coding=utf-8 -*- from tkinter import filedialog import tkinter as tk import tkinter.scrolledte ...

  4. Broadcast Receviewer

    使用Braodcast Receiver 一.新建一个空的工程,命名为LearnBroadcastReceiver 二.为主界面添加一个按钮 三.新建一个broadcast receiver,命名为M ...

  5. centos用户权限设置

    了解常见的账号配置文件 学会管理用户账号.组账号 学会设置目录或文件的权限 学会设置目录或文件的归属 用户账号文件/etc/passwd   :保存用户名称.宿主目录.登录shall等基本信息 每一行 ...

  6. ubuntu14.04-rocketmq单机搭建

    需要环境: jdk(1.6+) git(如果clone源码,需要git,没有git直接下载gar包也行) maven3.x在安装之前确定自己已经安装了jdk:java -version 先获取reck ...

  7. vs2010配置OpenCV2.4.7详细步骤

    vs2010配置opencv2.4.7 需要注意:opencv里x86的vc10对应vs2010版本,vc11对应vs2012版本,vc12对应vs2013及以上版本,若vs2013版本的软件配置时选 ...

  8. genymotion是一款完全超越BlueStacks

    今天给大家推荐一款超赞的神器:genymotion. 一:什么是genymotion      genymotion是一款完全超越BlueStacks的安卓模拟器,正如它中文官网的介绍:快到极致的An ...

  9. sql CHARINDEX函数

    CHARINDEX函数返回字符或者字符串在另一个字符串中的起始位置.CHARINDEX函数调用方法如下: CHARINDEX ( expression1 , expression2 [ , start ...

  10. Dorado7检验器失效原因分析

    应用场景: AutoForm1使用包含A.B两个字段的DataType1. A字段不允许为空,并且B字段取值true时A字段需要重新输入,B取其它值时A值不需重新录入. 实现方法:A字段添加了非空检验 ...