运行一个MapReduce的作业,可以调用job对象的submit()方法(一般调用job的的waitForCompletion),主要是提交一个job。

整个作业的提交过程,涉及5个重要的实体对象:

(1)          Client,提交MapReduce作业

(2)          YARN resource manager:协调整个集群计算资源

(3)          YARN node managers:启动和监控集群中各机器的计算容器

(4)          MapReduce application master:协调Mapreduce作业任务运行,这个applicationmaster和Mapreduce tasks运行在容器上,这些容器有resource manager分配并由nodemanagers管理。

(5)          HDFS:各个实体之间共享资源文件


MR-3.Hadoop使用YARN运行MapReduce工作原理_hadoop


作业提交(Job Submission)

通过Job对象的submit()方法->获取JobSubmitter,并调用submitJobInternal()。客户端检查作业输出说明,计算输入分片,拷贝作业资源到HDFS。最后通过ResourceManager上的submitAppliction()方法提交作业。

源码分析:

class JobSubmitter {
/*客户端提交作业给resourcemanager*/
JobStatus submitJobInternal(Job job, Cluster cluster)
throws ClassNotFoundException, InterruptedException, IOException {
//客户端检查作业输出说明
checkSpecs(job);
//拷贝作业资源到HDFS
Configuration conf = job.getConfiguration();
addMRFrameworkToDistributedCache(conf);
copyAndConfigureFiles(job, submitJobDir);
// 计算输入分片Create the splits for the job
int maps = writeSplits(job, submitJobDir);
conf.setInt(MRJobConfig.NUM_MAPS, maps);
// job资源文件拷贝当前作业目录
writeConf(conf, submitJobFile);
//ResourceManager上的submitAppliction()方法
status = submitClient.submitJob(jobId, submitJobDir.toString(), job.getCredentials());
}
}


作业初始化(Job Initialization)

当ResourceManager接收到一个调用它的submitAppliction()方法时候,ResourceManager把请求传递给调度器YarnScheduler。其中:提供两种实现的调度器,分别为FifoScheduler、FairScheduler、CapacityScheduler。


MR-3.Hadoop使用YARN运行MapReduce工作原理_HDFS_02


YarnScheduler分配一个容器,ResourceManager在NodeManager的管理下application master’s process。它是是一个JAVA应用程序,主类是MRAppMaster。对作业进行初始化,并且接收HDFS客户端计算出InputSplit。然后为每个InputSplit创建MapTask。

 

接下来,The applicationmaster决定如何运行一个MapReduce作业的任务。若果作业比较小,The application master选择本地的JVM运行task。那么如何来判断是一个小作业呢?默认情况下,一个小的作业小于10个mappers且仅有一个reducer,文件的输入大小小于一个默认的HDFS大小。

 

任务任务运行之前,MRAppMaster会调用OutputCommitter类中的setupJob( )方法,默认情况下,创建job的最终输出目录以及任务输出的临时工作目录。

 

 任务分配(Task Assignment)

如果Job不适合作为uber任务运行,那么the applicationmaster作业中的所有MapTask和ReduceTask向the resourcemanager请求容器。其中MapTask的请求高于ReduceTask请求优先执行,所有的MapTask执行完成后,Reduce的sort阶段开始开始执行。

 

请求需要为Tasks指定特定的内存和CPU。默认情况想,每个MapTask和ReduceTask被分片1024MB内存和一个虚拟core。也可以通过下面的配置进行调整内存和CPU的core数:

mapreduce. map. memory. Mb

mapreduce. reduce. memory. mb

mapreduce. map. cpu. vcores
mapreduce. reduce. cpu. vcores

 

总之,任务分配节点主要为MapTask和ReduceTask提供内存和CPU资源。

 任务执行(Task Execution)

一旦resource manager’sscheduler为task分配了container, theapplication master通过与node manager并启动container。该Task有JAVA应用主类YarnChild来执行,在run task之前,YarnChild会拉取任务所需资源,主要包括Job配置、Jar File和所有来自DistributeCache的文件。然后YarnChild会运行MapTask或者ReduceTask。