码迷,mamicode.com
首页 > 其他好文 > 详细

hadoop运行原理之作业提交(一)

时间:2014-09-28 21:18:35      阅读:152      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   io   使用   ar   java   strong   

  这部分的计划是这样的,首先解释JobTracker的启动过程和作业从JobClient提交到JobTracker上;然后;最后将整个流程debug一遍来加深映象。

  在看JobTracker源代码的时候就会发现,它里边有main()方法,这就说明了它是一个独立的java进程。在hadoop根目录下的bin文件夹中的hadoop脚本中可以看到,它指定了JobTracker类。如下图所示:

bubuko.com,布布扣

  JobTracker的main()方法中最主要的是以下两条语句:

 1 public static void main(String argv[]
 2                           ) throws IOException, InterruptedException {
 3     StringUtils.startupShutdownMessage(JobTracker.class, argv, LOG);
 4     
 5     try {
 6       if(argv.length == 0) {
 7         JobTracker tracker = startTracker(new JobConf());//用来生成JobTracker对象
 8         tracker.offerService();//初始化JobTracker,并启动作业调度器
 9       }
10       else {
11         if ("-dumpConfiguration".equals(argv[0]) && argv.length == 1) {
12           dumpConfiguration(new PrintWriter(System.out));
13         }
14         else {
15           System.out.println("usage: JobTracker [-dumpConfiguration]");
16           System.exit(-1);
17         }
18       }
19     } catch (Throwable e) {
20       LOG.fatal(StringUtils.stringifyException(e));
21       System.exit(-1);
22     }
23   }

  startTracker()方法比较简单,通过几次方法调用最终生成JobTracker对象。下面重点分析offerService()方法。由于篇幅限制,只列出了最重要的部分:

 1 public void offerService() throws InterruptedException, IOException {
 2      ......
 3 
 4     // Initialize the JobTracker FileSystem within safemode
 5     setSafeModeInternal(SafeModeAction.SAFEMODE_ENTER);
 6     initializeFilesystem();
 7     setSafeModeInternal(SafeModeAction.SAFEMODE_LEAVE);
 8     
 9     // Initialize JobTracker
10     initialize();
11     
12      ......
13     taskScheduler.start();

  首先进入安全模式下(SAFEMODE_ENTER),初始化文件系统,然后退出安全模式(SAFEMODE_LEAVE)。然后初始化JobTracker。最后启动作业调度器(TaskScheduler)。默认的作业调度器是JobQueueTaskScheduler,在mapred-default.xml中配置。所以taskScheduler.start()会调用JobQueueTaskScheduler的start()方法。如下所示:

bubuko.com,布布扣

  JobQueueTaskScheduler使用FIFO来对job进行调度。下面来进入到JobQueueTaskScheduler来分析start()方法。

1 @Override
2   public synchronized void start() throws IOException {
3     super.start();
4     taskTrackerManager.addJobInProgressListener(jobQueueJobInProgressListener);
5     eagerTaskInitializationListener.setTaskTrackerManager(taskTrackerManager);
6     eagerTaskInitializationListener.start();
7     taskTrackerManager.addJobInProgressListener(
8         eagerTaskInitializationListener);
9   }

  这里用到了观察者模式,JobQueueTaskScheduler向JobTracker注册了两个JobInProgressListener:EagerTaskInitializationListener和JobQueueJobInProgressListener,分别用于作业初始化和作业排序。

  这里的taskTrackerManager实际上是JobTracker,因为JobTracker的父类就是TaskTrackerManager。在JobTracker的startTracker()方法中,将JobTracker实例传递给TaskTrackerManager。如下所示:  

1 public static JobTracker startTracker(JobConf conf, String identifier, boolean initialize) 
2   throws IOException, InterruptedException {
3     DefaultMetricsSystem.initialize("JobTracker");
4     JobTracker result = null;
5     while (true) {
6       try {
7         result = new JobTracker(conf, identifier);
8         result.taskScheduler.setTaskTrackerManager(result);
9        ......

  在eagerTaskInitializationListener.start()方法中,

啊发生

 

 

 

 

 

 

 

 

 

 

 

 

  本文基于hadoop1.2.1

 

  如有错误,还请指正

 

  参考文章:《Hadoop权威指南》 Tom White

  转载请注明出处:http://www.cnblogs.com/gwgyk/p/3997849.html 

hadoop运行原理之作业提交(一)

标签:style   blog   http   color   io   使用   ar   java   strong   

原文地址:http://www.cnblogs.com/gwgyk/p/3998753.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!