步骤2 提交ApplicationMaster。将启动ApplicationMaster所需的所有信息打包到数据结构ApplicationSubmissionContext中,主要者告包括以下几种信息:
(1) application id
(2) application 名称
(3) application优先级
(4) application 所属队列
(5) application 启动用户名
(6) ApplicationMaster对应的Container信息,包括:启动ApplicationMaster所需老正各种文件资源、jar包、环境变量、启动命令、运行ApplicationMaster所需的资源(主要指内存)等。
客户端调用ClientRMProtocol#submitApplication(ApplicationSubmissionContext)将ApplicationMaster提交到ResourceManager上。
(ResourceManager收到请求后,会为ApplicationMaster寻找合适的节点,并在该节点上启动它)。
客户端可通过多种方式查询应用程序的运行状态,其中一种是调用RPC函数ClientRMProtocol#getApplicationReport获取一个应用程序当前运行状况报告,该报告内容包括应用程序名称、所属用户、所在队列、ApplicationMaster所在节点、一些诊断信息、启动时间等。
(2)编写ApplicationMaster
ApplicationMaster需要与ResoureManager和NodeManager交互,以申请资源和启动Container,期间涉及到多个数据结构和两个RPC协议。具体步骤如下:
步骤1 注册。ApplicationMaster首先需通过RPC协议AMRMProtocol向ResourceManager发送注册请求RegisterApplicationMasterRequest,首含明该数据结构中包含ApplicationMaster所在节点的host、RPC port和TrackingUrl等信息,而ResourceManager将返回RegisterApplicationMasterResponse,该数据结构中包含多种信息,包括该应用程序的ACL列表、可资源使用上限和下限等。
步骤2 申请资源。根据每个任务的资源需求,ApplicationMaster可向ResourceManager申请一系列用于运行任务的Container,ApplicationMaster使用ResourceRequest类描述每个Container(一个container只能运行一个任务):
1)Hostname期望Container所在的节点,如果是“*”,表示可以为任意节点。
2)Resource capability 运行该任务所需的资源量,当前仅支持内存资源。
3)Priority 任务优先级。一个应用程序中的任务可能有多种优先级,ResourceManager会优先为高优先级的任务分配资源。
4)numContainers符合以上条件的container数目。
一旦为任务构造了Container后,ApplicationMaster会使用RPC函数AMRMProtocol#allocate向ResourceManager发送一个AllocateRequest对象,以请求分配这些Container,AllocateRequest中包含以下信息:
1)Requested containers 所需的Container列表
2)Released containers有些情况下,比如有些任务在某些节点上失败过,则ApplicationMaster不想再在这些节点上运行任务,此时可要求释放这些节点上的Container。
3)Progress update information 应用程序执行进度
4)ResponseId RPC响应ID,每次调用RPC,该值会加1。
ResourceManager会为ApplicationMaster返回一个AllocateResponse对象,该对象中主要信息包含在AMResponse中:
1)reboot ApplicationMaster是否需要重新初始化.当ResourceManager端出现不一致状态时,会要求对应的ApplicationMaster重新初始化。
2)Allocated Containers 新分配的container列表。
3)Completed Containers已运行完成的container列表,该列表中包含运行成功和未成功的Container,ApplicationMaster可能需要重新运行那些未运行成功的Container。
ApplicationMaster会不断追踪已经获取的container,且只有当需求发生变化时,才允许重新为Container申请资源。
步骤3 启动Container。当ApplicationMaster(从ResourceManager端)收到新分配的Container列表后,会使用RPC函数ContainerManager#startContainer向对应的NodeManager发送ContainerLaunchContext以启动Container,ContainerLaunchContext包含以下内容:
1)ContainerId Container id
2)Resource 该Container可使用的资源量(当前仅支持内存)
3)UserContainer所属用户
4)Security tokens 安全令牌,只有持有该令牌才可启动container
5)LocalResource运行Container所需的本地资源,比如jar包、二进制文件、其他外部文件等。
6)ServiceData 应用程序可能使用其他外部服务,这些服务相关的数据通过该参数指定。
6)Environment启动container所需的环境变量
7)command启动container的命令
ApplicationMaster会不断重复步骤2~3,直到所有任务运行成功,此时,它会调用AMRMProtocol#finishApplicationMaster,以告诉ResourceManage自己运行结束。
【注意】 整个运行过程中,ApplicationMaster需通过心跳与ResourceManager保持联系,这是因为,如果一段时间内(默认是10min),ResourceManager未收到ApplicationMaster信息,则认为它死掉了,会重新调度或者让其失败。通常而言,ApplicationMaster周期性调用RPC函数AMRMProtocol#allocate向其发送空的AllocateRequest请求即可。
step1:client请求Rescouce Manager运行一个 Application Master实例step2:Rescource Manager 选择一个Node Manager,启动一个Container并运行Application Master实例(step 2a,step 2b);
step3:Application Master根据实际需要向RM请求更多的Container资源;
step4:AM通过获取到的Container资源执行分布式计算(step4a、step4b)
RM:Resource Manager ;
1、RM处理客户端请求,接收JobSubmitter提交的作业(上图step1),按照作业的上下文(Context)信息,以及从NodeManage让(NM)收集来的状态信息,启动调度过程,分配一个粗迅睁Container作为App Master
2、RM拥有为系统中所有应用资源分配的决定权,是中心服务,做的事情就是调度、启动每一个Job所属是Application(AM),另外监控AM的存在情况
3、与运行在每个节点上的NM进程交互,通过心跳通信,达到监控NM的目的
4、RM有一个可插拔的调度器组件Scheduler
——Scheduler是一个纯粹的调度器(只负责任务的调度)
NM:Node Manager
1、是slave进程,是每个节点框架代理
2、处理来自RM的任务请求
3、接收并处理来自AM的Container启动、停止等各种请求
4、其责启动应用程序的Container(执行应用程序的容器),并监控他们的资源使用情况(CPU、内存、磁盘、网络),并报告给RM
5、总而言之,在单节点上进行资源管理和任务管理
AM:Application Master,
1、应用程序的Master,每一个应用对用一个AM,在用户提交一个应用程序时,一个AM是轻量行进程实例会启动(Step2),AM协调应用程序内的所有任务执行(多个MAP/REDUCE)
2、负责一个Job生命周期内的所有工作,监控job执行状态和进度,如果任务失败,则重新启动任务
3、每一个job都有一个AM,运行在RM以外的机器上
4、与RM协商资源
——与Scheduler协商合适的Container
5、与NM协同工作,进行Container的监控
6、是一个普通Container的身份运行
Container
1、是任务运行环境的抽象封装
2、Container只是使用NM上指定资源的权利
3、AM必须向NM提供更多的信息来启动Container
4、描述任务的运行资源(节点、内存、cpu)
应用:YARN上的应用按其运行的生命周期的长短可分为长应用和短引用
1、短应用昌姿通常是分析作业,作业从提交到完成,所耗时间是有限的,作业完成后,其占用的资源就会被释放,归还给YARN再次分配
2、长应用通常是一些服务,启动后除非意外或人为终止,将一直运行下去,长应用通常长期暂用集群上的一些资源,且运行期间对资源的需求也时常变化。
下面再贴一个从别人那里引用过来的图和过程;更详细的启动过程见链接
https://www.cnblogs.com/admln/p/hadoop2-work-excute-yarn.html
用户向YARN提交一个应用程序后,YARN将分为两个阶段运行该应用程序:第一个阶段是启动ApplicationMaster;第二个阶段是由ApplicationMaster创建应用程序,为它申请资源,并监控它的整个运行过程,直到运行成功。
YARN的工作流程可以分为以下几个步骤:
1.用户向YARN提交应用程序,其中包括ApplicationMaster程序、启动ApplicationMaster的命令、用户程序等;
2.ResourceManager为该应用程序分配第一个Container,并与对应的NodeManager通信,要求它在岩岁这个Container中启动应用程序的ApplicationMaster;
3.ApplicationMaster启动后首先向ResourceManager注册,这样用户可以直接通过ResourceManager查看应用程序的运行状态,然后它将为各个任务申请资源,并监控它的运行状态,直到运行结束,即重复步骤4~7;
4.ApplicationMaster采用轮询的方式通过RPC协议向ResourceManager申请和领取资源;
5.一旦ApplicationMaster申请到资源后,则与对应的NodeManager通信,要求其启动任务;
6.NodeManager为任务设置好运行环境(包括环境变量、jar包、二进制程序等)后,将任务启动命令写到一个脚本中,并通过运行该脚本启动任务;
7.各个任务通过某RPC协议向ApplicationMaster汇报自己的状态和进度,以让ApplicationMaster随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务。
在应用程序运行过程中,用户可以随时通过RPC向ApplicationMaster查询应用程序的当前运行状态;
8.应用程序运行完成后,ApplicationMaster向ResourceManager注销并关闭自己。
Apache Hadoop YARN (Yet Another Resource Negotiator,另一种资源协调者)是一种新的 Hadoop 资源管理器 ,它是一个通用资源管理系统,可为上层应用提供统一的资源管理和调度,它的引入为集群在指锋利用率、资源统一管理和数据共享等方面带来了巨大好处。
YARN大大提高了集群的资源利用率,并降低了集群管理成本。首先,YARN允许多个应用程序运行在一个集群中,并将资源按需分配给它们,这大大提高了资源利用率。其次,YARN允许各类短作业和长服务混合部署在一个集群中,并提供了容错、资源隔离及负载均衡等方面的支持,这大大简唯源晌化了作业和服务的部署和管理成本。
进入集群主页
选择需要添加服务的集群,添加服务
继续
分配角色
完成
与客户端交互,处理来自客户端的请求
启动裂虚和管理ApplicationMaster,并在它运行失败时重新启动它
管理NodeManager ,接收来自NodeManager 的资源汇报信息,并向NodeManager下达管理指令
资源管理与调度,接收来自ApplicationMaster 的资源申请请求,并为之分配资源
启动和监视节点上的计算容器
以心跳的形式向RM汇报本节点上的资源使用情况和各个Container的运行状态
接收并处理来自AM的Container启动/停止等各种请求
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)