【MR原理-2】MapReduce作业提交与初始化过程分析

本文详细介绍了MapReduce作业的提交与初始化过程,包括作业提交的四个步骤:用户使用Shell命令提交作业、JobClient上传文件到HDFS、调用RPC接口提交作业以及JobTracker的初始化。在初始化阶段,作业被分解成Map Task、Reduce Task等四类任务,并由TaskScheduler进行调度执行。

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

导读:
1. 作业提交与初始化概述
2. 作业提交过程详解
3. 作业初始化过程详解

一、作业提交与初始化概述

  作业提交过程比较简单,主要为后续作业执行准备环境,主要涉及创建目录、上传文件等操作;而一旦用户提交作业后,JobTracker端便会对作业进行初始化。作业初始化的主要工作是根据输入数据量和作业配置参数将作业分解成若干个Map Task以及Reduce Task,并添加到相关数据结构中,以等待后续被调度执行。总之,可将作业提交与初始化过程分为四个步骤:

这里写图片描述
MapReduce作业提价与初始化过程

步骤1:用户使用Hadoop提供的Shell命令提交作业。
步骤2:JobClient按照作业配置信息(JobConf)将作业运行需要的全部文件上传到JobTracker文件系统HDFS的某个目录下。
步骤3:JobClient调用RPC接口向JobTracker提交作业。
步骤4 :JobTracker接收到作业后,将其告知TaskScheduler,由TaskScheduler对作业进行初始化。

二、作业提交过程详解

2.1 执行Shell命令

$HADOOP_HOME/bin/hadoop jar xxx.jar \
  -D mapred.job.name=”xxx” \
  -D mapred.reduce.tasks=2 \
  -files=blacklist.txt,whitelist.txt \
  -libjars=third-party.jar \
  -archives=dictionary.zip \
  -input /test/input \
  -output /test/output

  当用户输入以上命令后,bin/hadoop脚本根据”jar”命令将作业交给RunJar类处理相关shell代码,RunJar类中的main函数经解压jar包和设置环境变量后,将运行参数传递给MapReduce程序,并运行。用户的MapReduce程序已经配置了作业运行时需要的各种信息(如Mapper类,Reducer类,Reduce Task个数等),它最终在main函数中调用job.waitForCompletion(true)函数提交任务,这之后会经过下图所示函数调用顺序才会将走也提交到JobTracker端。

这里写图片描述
作业提交过程中函数调用关系

2.2 作业文件上传

  JobClient将作业提交到JobTracker端之前,需要进行一些初始化工作,包括获取作业ID,创建HDFS目录,上传作业文件以及生成Split文件,这些工作由函数JobClient.submitJobInternal(job)实现,执行流程如图所示。

这里写图片描述
作业提交作业时序图

  MapReduce作业文件的上传与下载是由DistributedCache工具完成的,它是Hadoop为方便用户进行应用程序开发而设计的数据分发工具。其整个工作流程对用户而言是透明的,即用户只需在提交作业时指定文件位置,至于这些文件的分发,完全由DistributedCache工具完成,不需要用户参与。
  通常而言,对于一个典型的Java MapReduce作业,可能包含以下资源:
  程序jar包:用户用Java编写的MapReduce应用程序jar包。
  作业配置文件:描述MapReduce应用程序的配置信息,根据JobConf对象生成的xml文件。
  依赖的第三方jar包:应用程序依赖的第三方jar包,提交作业时用参数”-libjars”指定。
  依赖的归档文件:应用程序中用到多个文件,可直接打包成归档文件(通常为一些压缩文件),提交作业时用参数”-archives”指定。
  依赖的普通文件:应用程序中可能用到普通文件,比如文本格式的字典文件,提交作业时用参数”-files”指定。

2.3 产生InputSplit文件

  用户提交MapReduce作业后,JobClient会调用InputFormat的getSplits()方法生成InputSplit相关信息。该信息包括两部分:InputSplit元数据信息和原始InputSplit信息。其中,第一部分将被JobTracker使用,用以生成Task本地性(Task Locality)相关的数据结构;而第二部分则将被Map Task初始化时使用,用以获取自己要处理的数据。
2.4 作业提交到JobTracker
  JobClient最终调用RPC方法submitJob()将作业提交到JobTracker端,在JobTracker.submitJob(),会依次进入一下操作:
(1)为作业创建JobInProcess对象
  JobTracker会为每个作业创建一个JobInProcess对象。该对象维护了作业的运行时信息。它在作业运行过程中一直存在,主要用于跟踪正在运行作业的运行状态和进度。
(2)检查用户是否具有指定队列的作业提交权限
  Hadoop以队列为单位管理作业和资源,每个队列分配有一定量的资源,每个用户属于一个或者多个队列且只能使用所述队列中的资源。
(3)检查作业配置的内存使用量是否合理
  用户提交作业时,可分别用参数mapred.job.map.memory.mb和mapred.job.reduce.memory.mb指定Map Task和Reduce Task占用的内存量;而管理员可通过参数mapred.cluster.max.map.memory.mb和mapred.cluster.max.reduce.memory.mb限制用户配置的任务最大内存使用量,一旦用户配置的内存使用量超过系统限制,则作业提交失败。
(4)通知TaskTracker初始化作业
  JobTracker收到作业后,并不会马上对其进行初始化,而是交给调度器,由它按照一定的策略对作业进行初始化。之所以不选择JobTracker而让调度器初始化,主要考虑到以下两个原因:
  (a)作业一旦初始化后便会占用一定量的内存资源,为了防止大量初始化的作业排队等待调度而占用大量不必要的内存资源,Hadoop按照一定的策略选择性地初始化作业以节省内存资源;
  (b)任务调度器的职责是根据每个节点的资源使用情况对其分配最合适的任务,而只有经过初始化的作业才有可能得到调度,因而将作业初始化策略嵌到调度器中是一种比较合理的设计。

三、作业初始化过程详解

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

这里写图片描述
作业初始化过程概述

  如图所示,Hadoop把每个作业分解成4中类型的任务,分别是Setup Task、Map Task、Reduce Task和Cleanup Task。它们的运行时信息由TaskInProgress类维护,因此创建这些任务实际上是创建TaskInProgress对象。

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

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

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

  Cleanup Task:作业结束标志性任务,主要完成一些作业清理工作,比如删除作业运行过程中用到的一些临时目录。一旦该任务运行成功后,作业由RUNNING状态变成SUCCEEDED状态。

【参考资料】

[1] 董西成,《Hadoop技术内幕:深入解析MapReduce架构设计与实现原理》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值