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

  这部分的计划是这样的,首先解释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 

时间: 2024-08-07 17:01:55

hadoop运行原理之作业提交(一)的相关文章

hadoop运行原理之Job运行(二) Job提交及初始化

本篇主要介绍Job从客户端提交到JobTracker及其被初始化的过程. 以WordCount为例,以前的程序都是通过JobClient.runJob()方法来提交Job,但是现在大多用Job.waitForCompletion(true)方法来提交(true表示打印出运行过程),但其本质都是一样的,最终都是通过JobClient的submitJobInternal()方法来提交Job.

hadoop运行原理之Job运行(四) JobTracker端心跳机制分析

接着上篇来说,TaskTracker端的transmitHeartBeat()方法通过RPC调用JobTracker端的heartbeat()方法来接收心跳并返回心跳应答.还是先看看这张图,对它的大概流程有个了解. 下面来一段一段的分析该方法. 1 public synchronized HeartbeatResponse heartbeat(TaskTrackerStatus status, 2 boolean restarted, 3 boolean initialContact, 4 bo

hadoop运行原理之Job运行(三) TaskTracker的启动及初始化

与JobTracker一样,TaskTracker也有main()方法,然后以线程的方式启动(继承了Runnable接口).main()方法中主要包含两步:一是创建一个TaskTracker对象:二是启动TaskTracker线程. 1 public static void main(String argv[]) throws Exception { 2 ... 3 try { 4 JobConf conf=new JobConf(); 5 ... 6 TaskTracker tt = new

hadoop运行原理之shuffle

hadoop的核心思想是MapReduce,但shuffle又是MapReduce的核心.shuffle的主要工作是从Map结束到Reduce开始之间的过程.首先看下这张图,就能了解shuffle所处的位置.图中的partitions.copy phase.sort phase所代表的就是shuffle的不同阶段. shuffle阶段又可以分为Map端的shuffle和Reduce端的shuffle. 一.Map端的shuffle Map端会处理输入数据并产生中间结果,这个中间结果会写到本地磁盘

hadoop运行原理之Job运行(五) 任务调度

接着上篇来说.hadoop首先调度辅助型task(job-cleanup task.task-cleanup task和job-setup task),这是由JobTracker来完成的:但对于计算型task,则是由作业调度器TaskScheduler来分配的,其默认实现为JobQueueTaskScheduler.具体过程在assignTasks()方法中完成,下面来一段一段的分析该方法.

[转]hadoop运行mapreduce作业无法连接0.0.0.0/0.0.0.0:10020

14/04/04 17:15:12 INFO mapreduce.Job:  map 0% reduce 0% 14/04/04 17:19:42 INFO mapreduce.Job:  map 41% reduce 0% 14/04/04 17:19:53 INFO mapreduce.Job:  map 64% reduce 0% 14/04/04 17:19:55 INFO mapreduce.Job:  map 52% reduce 0% 14/04/04 17:19:57 INFO 

Hadoop之 - 剖析 MapReduce 作业的运行机制(MapReduce 2)

在0.20版本及更早期的系列中,mapred.job.tracker 决定了执行MapReduce程序的方式.如果这个配置属性被设置为local(默认值),则使用本地的作业运行器.运行器在耽搁JVM上运行整个作业.它被设计用来在小的数据集上测试和运行MapReduce程序. 如果 mapred.job.tracker 被设置为用冒号分开的主机和端口对(主机:端口),那么该配置属性就被解释为一个jobtracker地址,运行器则将作业提交给该地址的jobtracker. Hadoop 2.x引入了

Hadoop伪分布安装详解+MapReduce运行原理+基于MapReduce的KNN算法实现

本篇博客将围绕Hadoop伪分布安装+MapReduce运行原理+基于MapReduce的KNN算法实现这三个方面进行叙述. (一)Hadoop伪分布安装 1.简述Hadoop的安装模式中–伪分布模式与集群模式的区别与联系. Hadoop的安装方式有三种:本地模式,伪分布模式,集群(分布)模式,其中后两种模式为重点,有意义 伪分布:如果Hadoop对应的Java进程都运行在一个物理机器上,称为伪分布 分布:如果Hadoop对应的Java进程运行在多台物理机器上,称为分布.[集群就是有主有从] 伪

【转载】Spark系列之运行原理和架构

参考 http://www.cnblogs.com/shishanyuan/p/4721326.html 1. Spark运行架构 1.1 术语定义 lApplication:Spark Application的概念和Hadoop MapReduce中的类似,指的是用户编写的Spark应用程序,包含了一个Driver 功能的代码和分布在集群中多个节点上运行的Executor代码: lDriver:Spark中的Driver即运行上述Application的main()函数并且创建SparkCon