您的位置:首页 > 运维架构

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

2016-01-29 16:21 519 查看
运行一个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:各个实体之间共享资源文件



作业提交(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。



YarnScheduler分配一个容器,ResourceManager在NodeManager的管理下application master’s process。它是是一个J***A应用程序,主类是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有J***A应用主类YarnChild来执行,在run task之前,YarnChild会拉取任务所需资源,主要包括Job配置、Jar File和所有来自DistributeCache的文件。然后YarnChild会运行MapTask或者ReduceTask。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: