运行一个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()方法提交作业。
源码分析:
作业初始化(Job Initialization)
当ResourceManager接收到一个调用它的submitAppliction()方法时候,ResourceManager把请求传递给调度器YarnScheduler。其中:提供两种实现的调度器,分别为FifoScheduler、FairScheduler、CapacityScheduler。
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。