YARN的组成
yarn主要由ResourceManager,NodeManager,ApplicationMaster和Container等几个组件组成。
ResourceManager(RM)
RM是全局资源管理器,负责整个系统的资源管理和分配。
主要由两个组件组成:调度器和应用 程序管理器(ASM)
调度器
调度器根据容量,队列等限制条件,将系统中的资源分配给各个正在运行的应用程序
不负责具体应用程序的相关工作,比如监控或跟踪状态
不负责重新启动失败任务
资源分配单位用“资源容器”resource Container表示
Container是一个动态资源分配单位,它将内存,CPU,磁盘,网络等资源封装在一起,从而限定每个任务的资源量
调度器是一个可插拔的组件,用户可以自行设计
YARN提供了多种直接可用的调度器,比如fair Scheduler和Capacity Scheduler等。
应用程序管理器
负责管理整个系统中所有应用程序
ApplicationMaster(AM)
用户提交的每个应用程序均包含一个AM
AM的主要功能
与RM调度器协商以获取资源(用Container表示)
将得到的任务进一步分配给内部的任务
与NM通信以自动/停止任务
监控所有任务运行状态,并在任务运行失败时重新为任务申请资源以重启任务
当前YARN自带了两个AM实现
一个用于演示AM编写方法的实例程序distributedshell
一个用于Mapreduce程序---MRAppMaster
其他的计算框架对应的AM正在开发中,比如spark等。
Nodemanager(NM)和Container
NM是每个节点上的资源和任务管理器
定时向RM汇报本节点上的资源使用情况和各个Container的运行状态
接收并处理来自AM的Container启动/停止等各种要求
Container是YARN中的资源抽象,它封装了某个节点上的多维度资源
YARN会为每个任务分配一个Container,且改任务只能使用该Container中描述的资源
Container不同于MRv1的slot,它是一个动态资源划分单位,是根据应用程序的需求动态产生的
yarn的通信协议
![](http://static.oschina.net/uploads/space/2014/0909/084639_88q3_1464779.jpg)
ResourceManager是Hadoop资源管理器Yarn的Master,负责资源的统一管理和调度。它与Yarn中另外三个组件协同工作,共同完成应用程序在Yarn上的资源管理与调度。通过以下这张图我们就可以看出ResourceManager在资源管理和调度中的地位和作用(ps:图片截取自董西成的《Hadoop技术内幕:深入解析YARN架构设计与实现原理》一书)。
- ApplicationClientProtocol(Client -> RM)
协议方法 | 功能描述 |
getNewApplication | 获取一个新的ApplicationId,例如返回的ApplicationId为application_1418024756741 |
submitApplication | 提交一个Application到RM |
forceKillApplication | 终止一个已经提交的Application |
getApplicationReport | 获取一个Application的状态报告信息ApplicationReport,包括用户、队列、名称、AM所在节点、AM的RPC端口、跟踪URL、AM状态、诊断信息(如果出错的话)、启动时间、提交Application的Client(如果启用安全策略) |
getClusterMetrics | 获取YARN集群信息,如节点数量 |
getApplications | 获取Application状态报告信息,和getApplicationReport类似,只不过增加了过滤器功能 |
getClusterNodes | 获取集群内所有节点的状态报告信息 |
getQueueInfo | 获取队列信息 |
getQueueUserAcls | 获取当前用户的队列ACL信息 |
getDelegationToken | 获取访问令牌信息,用于Container与RM端服务交互 |
renewDelegationToken | 更新已存在的访问令牌信息 |
cancelDelegationToken | 取消访问令牌 |
moveApplicationAcrossQueues | 将Application移动到另一个队列中 |
getApplicationAttemptReport | 获取Application Attempt状态报告信息ApplicationAttemptReport |
getApplicationAttemptReport | 获取Application Attempt状态报告信息,和getApplicationAttemptReport类似,只不过增加了过滤器功能 |
getContainerReport | 根据ContainerId获取Container状态报告信息ContainerReport,例如Container名称为container_e17_1410901177871_0001_01_000005,各个段的含义:container_e<epoch>_<clusterTimestamp>_<appId>_<attemptId>_<containerId> |
getContainers | 根据ApplicationAttemptId获取一个Application Attempt所使用的Container的状态报告信息,例如Container名称为container_1410901177871_0001_01_000005 |
submitReservation | 预定资源,以备在特殊情况下能够从集群获取到资源来运行程序,例如预留出资源供AM启动 |
updateReservation | 更新预定资源 |
deleteReservation | 删除预定 |
getNodeToLabels | 获取节点对应的Label集合 |
getClusterNodeLabels | 获取集群中所有节点的Label |
- ResourceTracker(NM -> RM)
协议方法 | 功能描述 |
registerNodeManager | NM向RM注册 |
nodeHeartbeat | NM向RM发送心跳状态报告 |
- ApplicationMasterProtocol(AM -> RM)
协议方法 | 功能描述 |
registerApplicationMaster | AM向RM注册 |
finishApplicationMaster | AM通知RM已经完成(成功/失败) |
allocate | AM向RM申请资源 |
- ContainerManagementProtocol(AM -> NM)
协议方法 | 功能描述 |
startContainers | AM向NM请求启动Container |
stopContainers | AM向NM请求停止Container |
getContainerStatuses | AM向NM请求查询当前Container的状态 |
- ResourceManagerAdministrationProtocol(RM Admin -> RM)
协议方法 | 功能描述 |
getGroupsForUser | 获取用户所在用户组,该协议继承自GetUserMappingsProtocol |
refreshQueues | 刷新队列配置 |
refreshNodes | 刷新节点配置 |
refreshSuperUserGroupsConfiguration | 刷新超级用户组配置 |
refreshUserToGroupsMappings | 刷新用户->用户组映射信息 |
refreshAdminAcls | 刷新Admin的ACL信息 |
refreshServiceAcls | 刷新服务级别信息(SLA) |
updateNodeResource | 更新在RM端维护的RMNode资源信息 |
addToClusterNodeLabels | 向集群中节点添加Label |
removeFromClusterNodeLabels | 移除集群中节点Label |
replaceLabelsOnNode | 替换集群中节点Label |
- HAServiceProtocol(Active RM HA Framework Standby RM)
协议方法 | 功能描述 |
monitorHealth | HA Framework监控服务的健康状态 |
transitionToActive | 使RM转移到Active状态 |
transitionToStandby | 使RM转移到Standby状态 |
getServiceStatus | 获取服务状态信息 |