1)客户端运行hadoop jar命令的时候,通过程序中的waitForCompletion(true),进行job的提交,jobPI等等,其中主要的一个工作就是和集群建立连接,会创建一个yarnRunner(实际上是创建resMgrDelegate)代理对象,这个对提交的时候会调用job.submit(),方法进行提交,此方法中会进行一系列的工作,比如确定job的状态,设置新的A象实际上是一个通信协议的对象。由这个对象去和RM通信。
2)客户端向RM(先请求RM,RM再转向applicationsManager/ASM)申请运行一个mr程序,获取一个applicationId。
3)RM会返回给客户端一个applicationId和一个共享资源的路径,用于提交程序运行所需要的共享资源
4)客户端拿到共享资源的路径,就开始进行将相关资源写入到共享资源路径中,相关资源就包括程序运行所需要的jar包及其他文件(job.jar)、配置文件参数job.xml(统一写入这个配置文件中)、切片信息(job.split)
5)写完之后客户端通过resMgrDelegate.submitApplication(appContext)方法向RM报告文件写入完毕,带着一个appContext的上下文并提交应用程序。
6)Rm接收到请求后,将这个请求转给yarn的资源调度器schedule,调度器会初始化这个应用,并将此应用程序加入到调度队列中(默认为容量调度),因为可能同时有很多应用在执行,可能没有资源供当前的程序跑,等待分配资源
resourceManager包括两个组件:
1、调度器:负责调度任务执行的顺序,仅是调度的作用,不参与任何任务的执行
(1)FIFO先进先出调度器:先来的任务先执行,只有一个队列
(2)Capacity容量(计算能力)调度器:有多个队列,为每个队列分配不同的资源,每个队列遵循FIFO(hadoop 2中默认的调度模型)
(3)Fair公平调度器:所有任务平分共享资源
2、任务管理器applicationsManager(ASM):负责任务启动或停止或失败启动
7)等到分配到相关资源之后就调度器会先给应用程序在一个nodemanager中分配一个容器(container),然后在容器中先启动程序的管理者,用于管理任务的运行进度和完成情况,这个管理者叫APP MASTER(主类是MRAppMaster)。
8)MRappmaster会对作业进行初始化,初始化的过程中会创建多个簿记对象(作业簿),用来跟踪作业的完成。
9)接下来MRAppMaster会启动相应的maptask,但是不知道启动几个啊,也不知道每一个对应的数据切片信息,怎么办?这时候就会去先访问共享文件系统中,获取本作业的输入切片信息。会获取到本job中有几个maptask和reducetask。此时mrappmaster会首先进行一个决策,就是如果maptask的数量小于10个,而reducetask的数量只有1个,并且输入大小小于一个块的作业,就会选用和MRAppmaster同一个JVM中运行任务,因为此时在别的节点上重新启动容器和销毁容器的开销过大不划算,这种模式就是uber模式。然后MRAppMaster会对每一个分片创建一个maptask对象。
10)如果作业不适合作为uber模式运行,此时MRAppMater就会为maptask和reducetask任务向RM申请资源,先发送maptask的请求,再发送reducetask的请求。注意maptask有数据本地化的局限。优先数据本地化,其次机架本地化最后任意节点。请求返回相应的节点信息。
11)RM向MRappMaster返回资源信息,空闲的资源节点,MRAppmaster就会去相应的nodemanager节点上启动Container
12)之后会启动一个YarnChild进程用于执行maptask程序
13)Maptask执行之前会首先去共享文件系统中下拷贝相应的文件,包括jar包、job.xml文件以及job.split分片信息等,下载到本地
14)启动相应的maptask任务
15)maptask进行到80%的时候,MRAppmaster会去启动reduceTask,启动过程同上述过程
16)资源回收和销毁