YARN将jobtracker的职能进行了划分,划分了两个独立的守护进程:管理集群上资源使用的资源管理器ResourceManager,管理集群上运行任务生命周期的应用管理器ApplicationMaster。基本思路是:AM与RM协商集群的计算资源:容器Container,在容器上运行特定应用程序的进程。容器由集群节点上运行的集群管理器NodeManager监视,以确保应用程序使用的资源不会超过分配给他的资源。
作业提交:从RM获取新作业的ID,作业客户端检查作业的输出说明,计算输入分片,将作业资源(包括作业JAR,配置和分片信息)复制到HDFS上,最后通过调用RM上的submitApplication()方法提交作业。
作业初始化:RM收到调用它的submitApplication()消息后,便将请求传递给调度器Schedule,调度器分配一个容器,RM在NM的管理下在容器中启动应用进程的master进程,即启动一个AM,AM是一个JAVA应用程序,AM对作业进行初始化:通过创建多个簿记对象以保持对作业进度的跟踪,它将接受来自任务的进度和完成报告,接下来他接受来自共享文件系统的客户端计算的输入分片。对每一个分片创建一个map任务对象以及多个reduce任务(数量由mapreduce.job.reduces属性确定)。接下来,AM决定如何运行构成mapreduce作业的各个任务。
任务分配:若不使用Uber模式,AM为该作业的所有map任务和reduce任务向RM请求容器。附着心跳信息请求和每个map任务的数据本地化信息,调度器使用这些信息做调度决策。请求也为任务指定了内存需求,默认情况下,map任务和reduce任务都分配到1024mb的内存,可以通过mapreduce.map.memory.mb和mapreduce.reduce.memory.mb来设置。MapReduce1中tasktracker在集群配置时设置的固定数量的槽,每个任务在一个槽上运行,槽有最大内存分配限制,当任务使用较少内存时无法充分利用内存以及由于任务不能获取足够内存而导致作业失败,YARN将资源分为更细的粒度,可以避免上述问题,具体而言:应用程序可以请求最小到最大限制范围内的任意最小值倍数的内存容量,默认的内存分配容量是调度器特定的,对于容器调度器,他的默认最小值是1024MB,默认最大值是10240MB。
任务执行:一旦RM的调度器为任务分配了容器,AM就与NM通信来启动容器,首先将任务需要的资源本地化,包括作业的配置、JAR文件和所有来自分布式缓存的文件。最后运行map任务或reduce任务。