Hadoop的Job提交流程简析(一)

Hadoop为使用者提供了三种提交作业的方法,提供了三种这样的API,之所以有三种不同的方法,是因为Hadoop在其历史上有新老两个API,以及一个变通的的方法,这三种方式分别是:
1、JobClient.runJob(): 调用由JobClient类提供的方法runJob(),这是老的API。
2、Job.waitForCompletion(): 调用由Job类提供的方法waitForCompletion(),属于新API。
3、ToolRunner.run():调用由ToolRunner类提供的run()方法,这属于变通的方法。

由于老API在现在已经很少使用了,只是为了维护老的版本所以代码中还保留着老的API。所以我们目前主要使用的是第2中API,Hadoop源码中也给出了它的示例程序:hadoop-mapreduce-project下的hadoop-mapreduce-examples下的WordCount.java

关于WordCount类的具体分析可以参考另一篇文章:(https://www.jianshu.com/p/3136a9fa84ed)

WordCount类中定义了两个类:TokenizerMapper 和 IntSumReducer。前者是对Mapper类的map方法进行了覆写,后者是对reducer类的reduce方法进行了覆写。如果提交的代码中没有覆写map和reduce方法,那么hadoop会自动使用自己默认的map reduce方法。


省略具体的map reduce的实现过程


以下的WordCount的main方法的代码:

  public static void main(String[] args) throws Exception {
    Configuration conf = new Configuration();
    String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
    if (otherArgs.length < 2) {
      System.err.println("Usage: wordcount <in> [<in>...] <out>");
      System.exit(2);
    }
    Job job = Job.getInstance(conf, "word count");
    job.setJarByClass(WordCount.class);
    job.setMapperClass(TokenizerMapper.class);
    job.setCombinerClass(IntSumReducer.class);
    job.setReducerClass(IntSumReducer.class);
    job.setOutputKeyClass(Text.class);
    job.setOutputValueClass(IntWritable.class);
    for (int i = 0; i < otherArgs.length - 1; ++i) {
      FileInputFormat.addInputPath(job, new Path(otherArgs[i]));
    }
    FileOutputFormat.setOutputPath(job,
      new Path(otherArgs[otherArgs.length - 1]));
    System.exit(job.waitForCompletion(true) ? 0 : 1);
  }

可以看到,程序新建了一个Job对象,调用其waitForCompletion方法进行作业的提交,该调用要等到方法的返回true才结束。System.exit(job.waitForCompletion(true) ? 0 : 1);的意思是如果返回true,那么程序返回0,System.exit。如果返回false,那么程序返回1,此时系统就知道了程序运行失败。

所以我们大致知道了Hadoop的mapreduce的job是怎么提交的,下面让我们看看Job类的具体实现:

public class Job extends JobContextImpl implements JobContext{}

在Job类里面定义了许多静态属性,
例如:public static enum JobState {DEFINE, RUNNING}定义了一个枚举属性JobState,DEFINE和RUNNING分别表示了job处于准备阶段和运行阶段。
private static final long MAX_JOBSTATUS_AGE = 1000 * 2 MAX_JOBSTATUS_AGE设置为2000,表示最多2000毫秒就要刷新这个作业的状态。
public static final String OUTPUT_FILTER = "org.apache.hadoop.mapreduce.client.output.filter" OUTPUT_FILTER表示在mapreduce的输出是否还需要一层过滤,如果需要的话以org.apache.hadoop.mapreduce.client.output.filter为键名去XML配置文件中查询。

其中我们最为关心的是waitForCompletion方法:

  public boolean waitForCompletion(boolean verbose
                                   ) throws IOException, InterruptedException,
                                            ClassNotFoundException {
    if (state == JobState.DEFINE) {//确认Job的状态,提交后变为Running
      submit();//通过Job.submit()提交流程
    }
    if (verbose) {//提交之后监控流程,直到结束
      monitorAndPrintJob();//周期性的报告作业进展
    } else {
      // get the completion poll interval from the client.
      int completionPollIntervalMillis = //周期性的询问作业是否已完成
        Job.getCompletionPollInterval(cluster.getConf());
      while (!isComplete()) {//询问作业是否完成
        try {
          Thread.sleep(completionPollIntervalMillis);//未完成,线程休眠一会
        } catch (InterruptedException ie) {//
        }
      }
    }
    return isSuccessful();
  }

该代码实际上就是对Job.submit的调用,只是在调用之前检查一下本作业是否处于DEFINE状态,以确保作业不会被提交多次。在作业提交成功之后就将其改为RUNNING。

在正常情况下,Job.submit()很快就会返回,因为这个方法的作用只是把作业提交上去,而无需等待作业的执行和完成,但是Job.waitForCompletion()则到等到程序完成以后才会返回。在等待期间,如果参数verbose为true,就要周期的报告作业执行的进展,或者就是周期的检测作业是否已经完成。

而后,就是对Job.sumbit()以后的第二段操作了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,014评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,796评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,484评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,830评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,946评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,114评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,182评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,927评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,369评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,678评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,832评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,533评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,166评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,885评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,128评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,659评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,738评论 2 351

推荐阅读更多精彩内容

  • 目的这篇教程从用户的角度出发,全面地介绍了Hadoop Map/Reduce框架的各个方面。先决条件请先确认Had...
    SeanC52111阅读 1,711评论 0 1
  • 我看见我的双手被风刮的通红,指骨上的皮僵硬着裂了口子,紧夹着深红的已凝固的稠血,像刺穿了的疼痛。 ...
    ZhongC阅读 724评论 0 4
  • 去年,任正非喊话“寻找加西亚”的消息闹得沸沸扬扬,低姿态高调召回已离职员工,网友纷纷表示“这样的老板请来一打”。 ...
    小路虎阅读 321评论 2 2
  • 作者通篇文章都是自己对母亲关心不够、服侍不到位,在母亲行将就木时,自私着狠心着,妄图一己之力与天斗,以期留住母亲。...
    凤歌儿阅读 204评论 5 1
  • 最近几天一直在不停的见人,选合伙人,通过不同的谈话,一般初创型公司的创业合伙人,一定合的是格局和未来公司的靠什么盈...
    草莓丫头阅读 273评论 1 0