yarn资源模型

yarn资源模型

Yarn资源模型:

  1. 客户端通知ResourceManager,它要提交一个应用程序。
  2. ResourceManager向客户端返回一个ApplicationID以及有助于客户端请求资源的集群容量信息。
  3. 客户端提交Application Submission Context做出响应,Applicaion Submission Context中包含了ApplicationID、用户名、队列及Container Launch Context, CLC提供了资源需求、作业文件以及在节点上启动ApplicationMaster需要的其他信息。
  4. Resource Manager为Application调度一个container用于启动Application Master,该container通常称为container0。Application Master启动后,向ResourceManager进行注册。
  5. ResourceManager会发送关于集群的资源信息给Application Master,ApplicationMaster决定如何使用当前可用的资源。
  6. Application Master收到来自Resource Manager的资源报告后,会请求一定量的container.
  7. ResourceManager会基于调度策略,尽可能优的为Application Master分配Container资源。

在作业执行过程中,Application Master会将作业的运行状况通过心跳发给Resource Manager。在这些心跳中,Application Master还可以请求和释放Container。当作业结束后,Application Master向Resource Manager发出一个Fish消息,然后退出。Resource Manager命令Node Manager杀死container。

1. ResourceManager

1.1 概述

ResourceManager是集群资源的仲裁者,它和下面的组件一起工作:

  • NodeManager,从ResourceManager中获取指令,管理单个节点上的可用资源,并接收ApplicationMaster的资源请求。
  • ApplicationMaster,负责向ResourceManager申请资源并且和NodeManager一起工作,启动、监控和停止Container。

ResourceMnager中有多个组件,ResourceManager在运行过程中会和Client、NodeManager、ApplcationMaster有通信交互过程。

1.2 ResourceManager和Client

1.2.1 Client Serivce

该组件处理所有来自客户端到ResourceManager的RPC通信,包括以下操作:

  • 应用程序提交
  • 应用程序终止
  • 获取应用程序,队列,集群统计,用户ACL及更多信息。

1.2.2 Administration Service

Client Service负责处理一般用户应用程序的提交和终止。为了确保管理员的请求不会被一般用户的请求额色,Yarn给所有的管理员操作服务提供了一个分离的接口Administration Service。

1.2.3 Application ACL Manager

1.2.4 ResourceManager Web Applicaition 和 Web Service

ResourceManager 有一个web应用程序用来输出集群的状态信息。

1.3 ResourceManager 和 Application Master

一旦应用程序通过ResourceManager中面向客户端的服务,被接纳入系统,它穿过ResourceManager内部负责拉起ApplicationMaster的状态机。

1.3.1 ApplicationMaster Service

该组件响应所有来自ApplicationMaster的请求。ApplicationMasterProtocol是ApplicationMaster和ResourceManager通信的唯一协议。负责以下任务:

  • 注册新的ApplicationMaster.
  • 来自任意正在结束的ApplicationMaster的终止、取消注册请求。
  • 认证来自不同ApplicationMaster的所有请求,确保只有合法的ApplicationMaster发送的请求传递给ResourceManager中的应用程序对象。
  • 获取来自所有运行的ApplicationMaster的Container的分配和释放请求,异步转发给YARN的调度器。

ApplicationMaster有额外的逻辑确保在任意时间点,任意ApplicationMaster只有一个线程可以发送请求给ResourceManager。ResourceManager上所有来自ApplicationMaster的RPC请求都进行了串行化。

1.3.2 ApplicationMaster存活监控

该监视器跟踪每个ApplicationMaster以及它最后的心跳时间。在指定的时间间隔内,没有产生心跳的ApplicationMaster被认为死亡且在ResourceManager中认为超时。所有处在运行/分配状态,并且从属于一个超时的ApplicationMaster的Container,也被标记为死亡。ResourceManager重新调度这个应用程序,在一个新的Container上运行一个新的ApplicationMaster实例,默认情况下,最多允许运行两次这样的尝试。

1.4 ResourceManager和NodeManager

1.4.1 Resource Tracker Service

NodeManager周期性的发送心跳到ResourceManager,ResourceManager的该组件负责响应来自所有节点的RPC。它负责以下任务:

  • 注册新节点
  • 接受前面注册节点的心跳
  • 确保只有“合法”的节点可以和ResourceManager通信,拒绝不合法节点。

1.4.2 NodeManager存活监控

该组件跟踪每一个节点的标志符和它最后的心跳时间。任何没有在配置的时间间隔内发送心跳的节点被认为死亡且在RM中超时。所有运行在当前超时节点上的Container被标记为死亡,且没有新的Container调度到该节点

1.5 ResourceManager核心组件

1.5.1 ApplicationsManager

ApplicationManager负责管理已提交的应用程序的集合。应用程序提交后,首先检查应用程序的规格,拒绝ApplicationMaster资源请求不合法的应用程序,然后确定没有其他已提交的应用程序已经使用了相同的ID,最后把通过检查的应用程序转给调度器。

1.5.2 ApplicationMaster Launcher

YARN中,每一个其他类型的Contaienr的拉起是由ApplicationMaster发起,ApplicationMaster本身的Container由ResourceManager申请,并在NodeManager上拉起。ApplicationMaster Launcher负责该项工作。该组件维护一个线程池来设置环境且和NodeManager通信来拉起ApplicationMaster。在一个应用程序正常结束或者强行终止时,负责告诉NodeManager来清理ApplicationMaster。

1.5.3 YarnScheduler

yarn调度器负责给正在运行的应用程序分配资源。

1.5.4 ContainerAllocationExpirer

该组件负责确保所有分配的Container最终被ApplicationMaster使用,并在相应的NodeManager上拉起。ApplicationMaster运行着非可信任的用户代码,可能拿到分配的Container而不使用它们。为解决该问题,ContainerAllocationExpirer包含了一个已分配但是还没有在相应NodeManager上启动的Container列表。对任意Container,在一个时间间隔内,如果相应的NodeManager没有报告RM该Container已经运行,则在RM中该容器被当作死亡。
NodeManager自己也查看该超时时间,若Container已经超时,则NodeManager拒绝拉起该Container。因此时钟同步很重要。

2. NodeManager

NodeManager根据Yarn应用程序的要求,使用节点上的物理资源来运行Container,NodeManager主要有以下职责:

  • 保持与ResourceManager的同步
  • 跟踪节点的健康状况
  • 管理各个Container的生命周期,监控每个Container的资源使用情况
  • 管理分布式缓存
  • 管理各个Container生成的日志

NodeManager启动后会向ResourceManager注册,NodeManager通过周期性的心跳汇报自己的状态并接受来自ResourceManager的指令,Scheduler处理一个节点的心跳时,会在相应的NodeManager上分配相应的Container,随后通过ApplicationMaster与ResourceManager的心跳将其返回给ApplicationMaster. 所有的Container都通过Container Launch Context来描述。在真正拉起一个Container之前,NodeManager会将所有需要的库文件下载到本地,NodeManager也可能按照ResourceManager的指令杀死Contaienr,Container退出时,NodeManager就会清理掉它的本地工作目录。NodeManager周期性地与ResourceManager通信,汇报各个Container的状态更新,ResourceManager会为之返回待清理的Container列表等信息。

3. ApplicationMaster

一旦应用程序被提交后,应用程序在ResourceManager中的代表将申请一个Container来启动Application Master。一旦分配了Container,ApplicationMasterLauncher将直接与该Container对应的NodeManager通信,以设置并启动Container,于是ApplicationMaster启动,ApplicationMaster向ResourceManager申请Container来执行实际的工作,计算过程在Container中进行,Container与Application Master保持通信,并告知任务过程。应用程序完成后,ApplicationMaster从ResourceManager中注销。

ApplicationMaster将负责以下任务:

  • 初始化向ResourceManager报告自己活跃信息的进程
  • 计算应用程序的资源需求
  • 将需求转换成YARN Scheduler可以理解的ResourceRequest
  • 与Yarn Scheduler协商申请资源
  • 监控Container的运行状态(从NodeManager获取)
  • 对Container失败的情况进行处理,在必要的情况下重新申请资源

ApplicationMaster从ResourceManager获得Container后,就可以执行Container的实际启动工作。启动Container前,首先根据需要构造ContainerLaunchContext对象,该对象包括资源分配的大小、启动Container的执行命令、进程环境等。它可以通过与NodeManager通信,逐一启动Container,也可以批量运行单个节点上的所有Container,ApplicationMaster向NodeManager节点发送StartContainerRequest请求,NodeManager通过StartContainerResponse响应,该响应包含成功启动的Container列表、每个失败的startContainerRequest对应的ContainerID到异常的映射。
ApplicationMaster可以向NodeManager发送StopContainerRequest请求,停止在该节点上运行的一系列Container,NodeManager通过StopContainersResponse回应。
当ApplicationMaster退出时,ResourceManager将根据它提交的上下文杀死所有正在运行而没有被ApplicationMaster显示终止的Container。

##总结:

NodeManager启动后,首先会向ResourceManager注册,然后定期心跳报告自身节点的状态信息及资源信息,告知自己还处于存活状态,ResourceManager在指定时间间隔内如果没有收到某个NodeManager的心跳报告,则认为该NodeManager节点不可用。然后,客户端提交作业给ResourceManager,ResourceManager会返回给客户端一个ApplicationID,客户端又向ResourceManager提交一个Application Submission Context,该上下文包含ApplicationID、队列名、作业文件、及启动ApplcationMaster的CLC(ContainerLaunchContext)等信息,ResourceManager会在某个NodeManager上启动Container0用于运行ApplicationMaster,(ApplicationMaster也会向ResourceManager进行定期心跳报告)并将当前集群的资源容量信息发给ApplicationMaster,ApplicationMaster计算application所需要的资源,然后将资源需求封装成yarn scheduler可以理解的resourceRequest格式,Yarn收到ApplicationMaster的资源请求后,尽可能最优的分配Container资源,ApplicationMaster在启动container之前会先进行构造ContainerLaunchContext对象,然后再向指定的NodeManager节点发出StartContainerRequest请求来启动Container,Container启动后,NodeManager会向ResourceManager汇报Container的状态信息,ResourceManager不解释也不关心Contaienr的状态,ResourceManager把有关Container的信息通知给ApplicationMaster,只有ApplicationMaster才能决定RM报告的Container的退出状态成功或失败的含义。ApplicationMaster判断程序运行结束后,发出Finish信号给ResourceManager,ApplicationMaster在发出信号后不会立即被杀死,直至ApplicationMaster自己退出,以便做一些清理工作。