Hadoop MapReduce之ReduceTask任务执行(六)

原创 2013年12月05日 15:46:17
  前面我们分别讨论了reduce的三个阶段,copy、sort、reduce,都是分开解析的,其实这些功能都包含在一个函数中,而且阶段分明,通过下面的分析,会对reduce流程理解会更清晰。下面函数的入口是Child.main -> taskFinal.run(job, umbilical)
public void run(JobConf job, final TaskUmbilicalProtocol umbilical)
    throws IOException, InterruptedException, ClassNotFoundException {
    this.umbilical = umbilical;
    job.setBoolean("mapred.skip.on", isSkipping());
		//设置reduce任务的三个阶段
    if (isMapOrReduce()) {
      copyPhase = getProgress().addPhase("copy");
      sortPhase  = getProgress().addPhase("sort");
      reducePhase = getProgress().addPhase("reduce");
    }
    // 启动通信进程用于和父进程通信
    TaskReporter reporter = new TaskReporter(getProgress(), umbilical,
        jvmContext);
    reporter.startCommunicationThread();
    boolean useNewApi = job.getUseNewReducer();
    initialize(job, getJobID(), reporter, useNewApi);


    // 检测作业类型
    if (jobCleanup) {
      runJobCleanupTask(umbilical, reporter);
      return;
    }
    if (jobSetup) {
      runJobSetupTask(umbilical, reporter);
      return;
    }
    if (taskCleanup) {
      runTaskCleanupTask(umbilical, reporter);
      return;
    }
    
    // Initialize the codec
    codec = initCodec();
		//进入copy阶段
    boolean isLocal = "local".equals(job.get("mapred.job.tracker", "local"));
    if (!isLocal) {
      reduceCopier = new ReduceCopier(umbilical, job, reporter);
      if (!reduceCopier.fetchOutputs()) {
        if(reduceCopier.mergeThrowable instanceof FSError) {
          throw (FSError)reduceCopier.mergeThrowable;
        }
        throw new IOException("Task: " + getTaskID() + 
            " - The reduce copier failed", reduceCopier.mergeThrowable);
      }
    }
    copyPhase.complete();                         // copy is already complete
    //进入排序阶段
    setPhase(TaskStatus.Phase.SORT);
    statusUpdate(umbilical);


    final FileSystem rfs = FileSystem.getLocal(job).getRaw();
    RawKeyValueIterator rIter = isLocal
      ? Merger.merge(job, rfs, job.getMapOutputKeyClass(),
          job.getMapOutputValueClass(), codec, getMapFiles(rfs, true),
          !conf.getKeepFailedTaskFiles(), job.getInt("io.sort.factor", 100),
          new Path(getTaskID().toString()), job.getOutputKeyComparator(),
          reporter, spilledRecordsCounter, null)
      : reduceCopier.createKVIterator(job, rfs, reporter);
        
    // free up the data structures
    mapOutputFilesOnDisk.clear();
    
    sortPhase.complete();                         // sort is complete
    //进入reduce阶段
    setPhase(TaskStatus.Phase.REDUCE); 
    statusUpdate(umbilical);
    Class keyClass = job.getMapOutputKeyClass();
    Class valueClass = job.getMapOutputValueClass();
    RawComparator comparator = job.getOutputValueGroupingComparator();


    if (useNewApi) {
      runNewReducer(job, umbilical, reporter, rIter, comparator, 
                    keyClass, valueClass);
    } else {
      runOldReducer(job, umbilical, reporter, rIter, comparator, 
                    keyClass, valueClass);
    }
    //全部执行完毕,结束与TT通信
    done(umbilical, reporter);
  }

Hadoop MapReduce之ReduceTask任务执行(四):排序与合并

上一篇讲了reduce如何把map输出下载到本地的过程,这个过程中包含了文件合并操作,本文主要讲reduce的下一个阶段:排序。reduce端的合并单位是Segment,在对Segment合并的过程中...

Hadoop MapReduce之ReduceTask任务执行(三):Merger线程分析

在reduce端的文件拷贝阶段,会将数据放入内存或直接放入磁盘中,如果文件全部拷贝完再进行合并那样必然降低作业效率,所以在拷贝进行到一定阶段,数据的合并就开始了,负责该工作的有两个线程:InMemFS...

Hadoop MapReduce之ReduceTask任务执行(一):远程拷贝map输出

reduce执行流程经历三个阶段:copy、sort、reduce,在第一阶段reduce任务会把map的输出拷贝至本地,通过线程MapOutputCopier,该线程通过http协议将map输出拷贝...

hadoop-mapreduce中reducetask运行分析

ReduceTask的运行 Reduce处理程序中需要执行三个类型的处理, 1.copy,从各map中copy数据过来 2.sort,对数据进行排序操作。 3.reduce,执行业务逻辑的处理...

Hadoop MapReduce 任务执行流程源代码详细解析

目录 1 引言  1.1 目的  1.2 读者范围 2 综述 3 代码详细分析  3.1 启动Hadoop集群  3.2 JobTracker启动以及Job的初始化  3.3 Task...
  • RiverM
  • RiverM
  • 2011年09月27日 15:01
  • 14354

Hadoop MapReduce 任务执行流程源代码详细解析

目录 1 引言  1.1 目的  1.2 读者范围 2 综述 3 代码详细分析  3.1 启动Hadoop集群  3.2 JobT...

Hadoop MapReduce 任务执行流程源代码详细解析

目录 1 引言  1.1 目的  1.2 读者范围 2 综述 3 代码详细分析  3.1 启动Hadoop集群  3.2 JobTracker启动以及Job的...

hadoop执行mapreduce任务,能够map,不能reduce,Shuffle阶段报错

第一次运行: [root@sjfx jar]# hadoop jar /home/tangzw/jar/GameLoginLogAnalyzeA.jar /tangzw/input ...
  • tzw1992
  • tzw1992
  • 2014年05月15日 15:39
  • 3034

hadoop 里执行 MapReduce 任务的几种常见方式

说明: 测试文件: 1 echo -e "aa\tbb \tcc\nbb\tcc\tdd" > 3.txt ...
  • jeek566
  • jeek566
  • 2013年07月04日 10:48
  • 521

Hadoop MapReduce之MapTask任务执行(四)

Map任务执行完前会对spill文件进行合并操作,每次spill都会生成一个spill文件,在传向reduce前,map会把这些文件合并为一个文件,文件合并不是一次性把所有文件合并的,每次合并的个数可...
  • lihm0_1
  • lihm0_1
  • 2013年11月23日 14:27
  • 1280
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Hadoop MapReduce之ReduceTask任务执行(六)
举报原因:
原因补充:

(最多只允许输入30个字)