YARN核心组件功能特性分析

1、YARN Client
YARN Client 提交Application 到ResourceManager,它会首先创建一个Application上下文件对象,并设置ApplicationMaster必需的资源请求信息,然后提交到ResourceManager。YARN Client也可以ResourceManager通信,获取到一个已经提交并运行的Application的状态信息等。

2、ResoutceManager****
管理者(主节点:做管理工作)+工作者(提供计算或者存储资源的,用来解决实际问题的)
ResourceManager上一个全局的资源管理器,集群只有一个,有SPOF问题,可以通过zookeeper实现HA机制,它主要负责整个系统的资源管理和分配,响应用户提交的不同类型应用程序的解析,调度,监控等工作,启动和监控ApplicationMaster,监控Nodemanger等。

整体职责解析
– 处理客户端请求
– 启动和监控ApplicationMaster
– 监控Nodemanager
– 负责资源的分配与调度

流程图如下:
在这里插入图片描述

所有这些Service都会经历三个步骤:
– Service实例的创建,创建好了以后,放在CompositeService的serviceList这个成员变量集合中
– 然后遍历这个ServiceList集合,取出每个service调用serviceInit()方法
– 然后遍历这个ServiceList集合,取出每个service调用serviceStart()方法

关于上述图中ResourceManager的主要成员工作职责解析
1. 用户交互模块
ClientService:是为普通用户提供的服务,它会处理来自客户端各种RPC请求,比如提交应用程序、终止应用程序,获取应用程序运行状态等。
AdminService:YARN 为管理员提供了一套独立的服务接口,以防止大量的普通用户请求使管理员发送的管理命令僵死,管理员可以通过这些接口管理集群,比如动态更新节点、列表、更新ACL列表,更新队列信息等。
2. NodeManger管理
NMLivelinessMonitor:监控NM是否活着,如果一个NodeManager在一定时间(默认10min)内未汇报心跳信息,则认为它死掉了,会将其从集群中移除。
NodesListManager:维护正常节点和异常节点列表,管理exlude和include节点列表,这两个列表均上在配置文件中设置的,可以动态加载。
ResourceTrackerService:处理来自NodeManger的请求,主要包括两种请求:注册和心跳,其中,注册上NodeManger启动时发生的行为,请求包中包含节点ID,可用的资源上限等信息,而心跳是周期性行为,包含各个container运行状态,运行的application列表、节点健康状况(可通过一个脚本设置),而ResourceTrackerService则为NM返回释放的Container列表、Application列表等。

  1. ApplicationMaster管理
    AMLiveLinessMonitor:监控AM是否活着,如果一个Applicationmaster在一定时间(默认10min)内未汇报心跳信息,则认为它死掉了,它上面所有正在运行的Container将被认为死亡,AM本身会被重新分配到另外一个节点上(用户可制定每个applicationMaster的尝试次数,默认上1次)执行。
    ApplicationMasterLauncher:与Nodemanager通信,要求它为某个应用程序启动ApplicationMaster。
    ApplicationMasterService:处理来自ApplicationMaster的请求,主要包括两种请求:注册和心跳,其中,注册上ApplicationMaster启动时发生的行为,包括请求包中包含的所有节点,RPC端口号和tracking URL等信息;而心跳是周期性行为,包含请求资源的类型描述、待释放的Container列表等,而AMS则为之返回新分配的Container、失败的container等信息。

  2. Application管理
    ApplicationACLsManager:管理应用程序访问权限,保护两部分权限,查看和修改,查看主要指查看应用程序基本信息,而修改则主要上修改应用程序优先级,杀死应用程序等。
    RMAppManager:管理应用程序的启动和关闭
    containerAllocationExpirer:YARN不允许AM获得Container后长时间不对其使用,因为这会降低整个集群的利用率,当AM收到RM新分配的一个Container后,必须在一定时间(默认为10min)内在对应用的NM上启动该Container,否则,RM会回收该Container。

3、ApplicationMaster****

一个application运行在YARN之上:主控程序(AM:TL)+任务程序(Task)
应用程序管理器ApplicationMaster负责管理整个系统中所有应用程序,包括应用程序提交、与调度器协商资源以启动MRAppMaster、监控MRAPPMaster运行状态并在失败时重新启动它等
整体职责解析:
– 每个运行在YARN内部的Application都会启动一个ApplicationMaster,负责向ResourceManager注册Application和申请Container
– ApplicationMaster就是运行在YARN集群中的NodeManager中,相比RMv1,不会对ResouceManager造成较大的负担
– 负责整个应用程序的管理,跟NodeManager通信启动或者停止Task,监控/收集Task执行进度结果,或者进行Task的容错
在这里插入图片描述

ResouceManager、ApplicationMaster、Task之间的关系
– 客户端提交Job到ResouceManager,ResouceManager会为该Job启动一个ApplicationMaster来负责这个Job中的所有的Task的执行,所以ResouceManager负责管理ApplicationMaster
– 启动的ApplicationMaster专门负责一个Job的所有的Task的启动,执行,生命周期管理,状态跟踪,容错等等

4、MRAPPMaster****
MRAppMaster就是MapReduce的一个Application应用程序运行在YARN之上的ApplicationMaster。
MRAPPMaster负责管理MapReduce作业的生命周期,当客户端提交一个MapReduce Job到YARN的时候,ResouceManager会指派一个NodeManager来启动一个MRAPPMaster主控程序,来主持这个MapReduce Job的所有Task的执行。

5、Scheduler

YARN的资源调度服务:根据应用程序的需要的资源请求以及集群的资源情况,为应用程序分配对应的资源,他不会关系你申请到的Container资源去做什么。调度器就是根据容量、队列一些限制条件,将系统中的资源分配给各个正在运行的应用程序,调度器就是一个纯调度器,就是它只管资源分配,不参与具体应用程序相关的工作。
YARN内部有3种资源调度策略的实现:FIFOScheduler、FairScheduler、CapacityScheduler,其中默认是CapacityScheduler。
– FIFOScheduler:先进先出,不考虑应用程序本身的优先级和资源使用情况
– CapacityScheduler:将资源分成队列,共享集群资源但需要保证队列的最小资源使用需求
– FairScheduler:公平的将资源分给应用,保证应用使用的资源是均衡的。

CapacityScheduler实现了资源更加细粒度的分配,可以设置多级队列,每个队列都有一定的容量,即对队列设置资源上限和下限,然后对每一级别队列分别再来用合适的调度策略进行调度

6、NodeManager

NodeManager是YARN集群当中真正资源的拥有者,是真正执行应用程序的容器的提供者,监控应用程序的资源使用情况(CPU、内存、硬盘、网络),并通过心跳向集群资源调度器ResouceManager进行汇报以更新自己的健康状态,同时其也会监督Container的生命周期管理,监控每个Container的资源使用情况。追踪节点健康状况,管理日志和不同应用程序用到的附属服务
整体职责:
– 管理自身的资源
– 处理来自ResouceManager的命令
– 处理来自ApplicationMaster的命令

在这里插入图片描述

所有这些Service都会经历三个步骤:
– Service实例的创建,创建好了以后,放在CompositeService的serviceList这个成员变量集合中
– 然后遍历这个ServiceList集合,取出每个service调用serviceInit()方法
– 然后遍历这个ServiceList集合,取出每个service调用serviceStart()方法

7、Container

Flink Slot=YARN Container逻辑资源管理单位
Container容器是一个抽象出来的逻辑资源单位,Container容器是由ResouceManager Scheduler服务动态分配的资源构成,它包含了该节点上的一定量CPU、内存、磁盘、网络等信息,MapReduce程序的所有Task都是在一个容器里执行完成的,容器的大小是可以动态调整的。
一个NodeManager节点会运行多个Container,但一个Container不会跨节点,任何 一个Job或Application必须有运行在一个或多个Container中,在YARN框架中,ResouceManager只负责告诉ApplicationMaster哪些Container可以用,ApplicationMaster还需要去找NodeManager请求分配具体的Container。