这部分的计划是这样的,首先解释JobTracker的启动过程和作业从JobClient提交到JobTracker上;然后;最后将整个流程debug一遍来加深映象。
在看JobTracker源代码的时候就会发现,它里边有main()方法,这就说明了它是一个独立的java进程。在hadoop根目录下的bin文件夹中的hadoop脚本中可以看到,它指定了JobTracker类。如下图所示:
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()方法。如下所示:
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