Hadoop作业初始化过程

Hadoop作业通过JobTracker.initJob()进行初始化,分解为Setup, Map, Reduce和Cleanup四种任务。Setup Task用于作业初始化,Map Task处理数据,Reduce Task进行数据聚合,Cleanup Task负责清理工作。每种任务由TaskInProgress类管理。作业状态根据任务进度变化,如Map Task完成一定比例后才开始调度Reduce Task。0.21.0版本后,Setup/Cleanup Task的使用成为可配置选项。" 126104886,14899579,MySQL GTID主从复制详解,"['数据库', 'mysql', '服务器']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

调度器调用JobTracker.initJob();函数对新作业进行初始化,作业初始化的主要工作是构造Map Task和Reduce Task并对它们进行初始化。

hadoop将每一个作业分解成4种类型的任务,分别是Setup Task、Map Task、Reduce Task和Cleanup Task .它们的运行时信息由TaskInprogress类维护。因此,创建这些任务实际上是创建TaskInProgress对象。
这里写图片描述

4中任务的作用以及创建过程如下:

1、Setup Task :作业初始化标识性任务,它进行一些非常简单的作业初始化工作,比如将作业状态设置为”setup”,调用OutputCommitter.setupjob()函数等。该任务运行完后,作业由PREP状态变为RUNNING状态。并开始运行Map Task。该类型任务又被分为Map Setup Task和Reduce Setup Task两种,且每个作业各有一个,他们运行时分别占用一个Map slot和reduce slot。由于这两种任务功能相同,因此有且只有一个可以获取运行的机会(即只要有一个开始运行,另一个马上被kill掉,而具体哪一个能够运行,取决于当前存在的空闲slot种类以调度策略)。

创建该类任务的相关代码如下:JobInProgess

// create two setup tips, one map and one reduce.

    setup = new TaskInProgress[2];

    // setup map tip. This map doesn't use any split. Just assign an empty split.

    setup[0] = new TaskInProgress(jobId, jobFile, emptySplit, 

            jobtracker, conf, this, numMapTasks + 1, 1);

    setup[0].setJobSetupTask();

    // setup reduce tip.

    setup[1] = new TaskInProgress(jobId, jobFile, numMapTasks,

                       numReduceTasks + 1, jobtracker, conf, this, 1);

    setup[1].setJobSetupTask();

2、Map Task:map阶段处理数据的任务,其数目及对应的处理数据分片由应用程序中的InputFormat组件确定。

相关代码如下:

TaskSplitMetaInfo[] splits = createSplits(jobId);

    if (numMapTasks != splits.length) {

      throw new IOException("Number of maps in JobConf doesn't match number of " +

          "recieved splits for job " + jobId + "! " +

          "numMapTasks=" + numMapTasks + ", #splits=" + splits.length);

    }

    numMapTasks = splits.length;



    // Sanity check the locations so we don't create/initialize unnecessary tasks

    for (TaskSplitMetaInfo split : splits) {

      NetUtils.verifyHostnames(split.getLocations());

    }

    jobtracker.getInstrumentation().addWaitingMaps(getJobID(), numMapTasks);

    jobtracker.getInstrumentation().addWaitingReduces(getJobID(), numReduceTasks);

    this.queueMetrics.addWaitingMaps(getJobID(), numMapTasks);

    this.queueMetrics.addWaitingReduces(getJobID(), numReduceTasks);

    maps = new TaskInProgress[numMapTasks];

    for(int i=0; i < numMapTasks; ++i) {

      inputLength += splits[i].getInputDataLength();

      maps[i] = new TaskInProgress(jobId, jobFile, 

                                   splits[i], 

                                   jobtracker, conf, this, i, numSlotsPerMap);

    }

3、Reduce Task Reduce阶段处理数据的任务,其数目有用户通过参数Mapred.reduce.tasks(默认数目为1)指定,考虑到Reduce Task能否运行依赖于Map Task的输出结果,因此,hadoop刚开始只会调度Map Task,直到Map Task完成数目达到一定比例(由参数Mapred.reduce.slowstart.completed.maps指定,默认是0.05,即5%)

相关代码如 // Create reduce tasks

 this.reduces = new TaskInProgress[numReduceTasks];

for (int i = 0; i < numReduceTasks; i++) {

  reduces[i] = new TaskInProgress(jobId, jobFile, 

                                  numMapTasks, i, 

                                  jobtracker, conf, this, numSlotsPerReduce);

  nonRunningReduces.add(reduces[i]);

}

4、Cleanup Task:作业结束标志性任务,主要完成一些作业清理工作,比如删除作业运行过程中用到的一些临时目录(比如 Temporary目录)。一旦该任务运行成功后,作业由RUNNING状态变为SUCCEEDED状态。这个和Setup Task 类似 会创建2个Task 一个Map Cleanup Task和Reduce Cleanup Task

代码如下:

// create cleanup two cleanup tips, one map and one reduce.

    cleanup = new TaskInProgress[2];

    // cleanup map tip. This map doesn't use any splits. Just assign an empty

    // split.

    TaskSplitMetaInfo emptySplit = JobSplit.EMPTY_TASK_SPLIT;

    cleanup[0] = new TaskInProgress(jobId, jobFile, emptySplit, 

            jobtracker, conf, this, numMapTasks, 1);

    cleanup[0].setJobCleanupTask();

    // cleanup reduce tip.

    cleanup[1] = new TaskInProgress(jobId, jobFile, numMapTasks,

                       numReduceTasks, jobtracker, conf, this, 1);

    cleanup[1].setJobCleanupTask();

有人发现引入Setup/Cleanup Task会拖慢作业执行进度且降低作业的可靠性,这主要是因为hadoop除了需要保证每个Map/Reduce Task运行成功外,还要保证Setup/Cleanup Task成功。对于Map/Reduce Task而言,可通过推测执行机制避免出现”拖后腿”的任务。然而,由于Setup/Cleanup Task不会处理任何数据,两种任务的进度只有0%和100%两个值,从而使得推测式任务机制对之不适用,为了解决这个问题,从0.21.0版本开始,hadoop将是否开启Setup/Cleanup Task 变成了可配置的选项,用户可通过参数 mapred.committer.job.set.cleanup.needed配置是否为作业创建Setup/Cleanup Task

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值