YARN介绍
Apache Hadoop YARN (Yet Another Resource Negotiator,另一种资源协调者)是一种新的Hadoop资源管理器。
YARN是一个通用资源管理系统和调度平台,可为上层应用提供统一的资源管理和调度。
YARN功能说明
- 资源管理系统:管理集群的硬件资源(内存、CPU等)
- 调度平台:多个程序同时申请资源时,资源如何分配?–>调度规则(算法)
- 通用:理论上支持各种计算程序(程序提交使用资源申请–>YARN分配资源–>使用结束释放资源)
YARN 架构、组件
官方架构图
YARN三大组件
- ResouceManager(RM)
YARN集群中的主角色,决定系统中所有应用程序之间资源分配的最终权限,即最终仲裁者。
接收用户的作业提交,并通过NM分配、管理各个机器上的计算机资源。
- NodeManager(NM)
YARN中的从角色,一台机器上一个,负管理本机器上的计算资源。
根据RM命令,启动Container容器、监视容器的资源使用情况。并向RM主角色汇报资源使用情况。
- ApplicationMaster(AM)
用户提交的每个应用程序均包含一个AM。应用程序内的老大,负责程序内部各阶段的资源申请,监督程序的执行情况。
程序提交YARN交互流程
核心交互流程
[ 注 ] 参照官方架构图理解
- MR作业提交 Client --> RM
- 资源申请 MrAppMaster --> RM
- MR作业状态汇报 Container(Map | Reduce Task) --> Container(MrAppMaster)
- 节点状态的汇报 NM --> RM
整体概述
当用户向YARN中提交一个应用程序后,YARN将分为两个阶段运行该应用程序
- 第一阶段:客户端申请资源启动运行本次程序的ApplicationMaster;
- 第二阶段:由ApplicationMaster根据程序内部情况为它申请资源,并监控它的整个运行过程,直到运行结束。
MR提交YARN交互流程
- 第一步 通过客户端向YARN中ResoureManager提交程序(比如Hadoop jar提交MR程序)
- 第二步 ResourceManager为该应用程序分配第一个Container(容器),并与对应的NodeManager通信,要求它在这个Container中启动这个应用程序的ApplicationMaster。
- 第三步 ApplicationMaster启动成功之后,首先向ResourceManage注册并保持通信,使得用户可以直接通过ResourceManage查看应用程序的运行状态。
- 第四步 AM为本次程序内部的各个Task任务向RM申请资源,并监控它的运行状态。
- 第五步 一旦ApplicationMaster申请到资源后,便与对应的NodeManager通信,要求它启动任务
- 第六步 NodeManager为任务设置好运行环境后,将任务启动命令写到一个脚本中,并通过运行该脚本启动任务。
- 第七步 各个任务通过某个RPC协议向ApplicationMaster汇报自己的状态和进度,以让ApplicationMaster随时掌握各个任务的运行状态从而可以在任务失败时候重新启动任务。在应用程序运行过程中,用户可以随时通过RPC向ApplicationMaster查询应用程序的当前运行状态。
- 应用程序运行完成后,ApplicationMaster向ResourceManager注销并关闭自己。
YARN资源调度器Schedule
如何理解资源调度?
理想情况下,应用程序提出的请求将立即得到YARN批准。实际场景中,资源是有限的,并且在繁忙的集群上。
YARN调度程序的工作是根据一些定义的策略为应用程序分配资源。
在YARN中,负责给应用分配资源的就是Scheduler,是ResourceManager的核心组件之一。Scheduler完全专用于调度作业,无法跟踪应用程序的状态。
资源调度策略
- 三种调度器
FIFO Scheduler(先进先出调度器)
Capacity Scheduler(容量调度器)
Fair Scheduler(公平调度器)
Apache版本的YARN默认使用Capacity Scheduler。
可以在 yarn-site.xml
文件中yarn.resourcemanager.scheduler.class
项配置其他的调度器
FIFO scheduler
- FIFO Scheduler是一个先进先出的思想,即先提交的应用先运行。调度工作不考虑优先级和范围,适用于负载较低 的小规模集群(当使用大型共享集群时,它的效率较低且会导致一些问题)。
- FIFO Scheduler拥有一个控制全局的队列queue,默认queue名称为default,该调度器会获取当前集群上所有的 资源信息作用于这个全局的queue。
优势:无需配置、先到先得、易于执行
劣势:不区分任务优先级,再高优先级的作业也需要等待,不适合共享集群。
capacity Scheduler
Capacity Scheduler容量调度是Apache Hadoop3.x默认调度策略。
- 该策略允许多个组织共享整个集群资源,每个组织可以可以获得集群的一部分计算能力。
- 通过为每个组织分配专门的队列,再为每个队列分配一定的集群资源,使得整个集群就可以通过设置多个队列的方式给多个组织提供服务
- Capacity可以理解成一个个的资源队列,这个资源队列是由用户自己分配。队列内部又可以垂直划分,这样一个组织内部的多个成员就可以共享该队列资源,在一个队列内部,资源的调度是采用的是先进先出(FIFO)策略。
- Capacity Scheduler调度器以队列为单位划分资源。每个队列有独立的资源,队列的结构和资源是可以进行配置的。
优势:
- 层次化的队列设计(Hierarchical Queues)
层次化的管理,可以更容易、更合理分配和限制资源的使用。
- 容量保证(Capacity Guarantees)
每个资源上都可以设置一个资源的占比,保证每个队列都不会占用整个集群的资源。
- 安全(Security)
每个队列有严格的访问控制。用户只能向自己队列里面提交任务,而且不能修改或者访问其他队列的任务。
- 弹性分配(Elasticity)
空闲资源可以分配给任何队列。当多个队列出现争抢时,会按照权重比例进行平衡。
Fair Scheduler
图解:公平共享
- 有两个用户A和B,每个用户都有自己的队列
- A启动一个作业,由于没有B的需求,他分配了集群所有的可用资源。
- 然后B在A的作业处于运行状态的同时启动了一个新的作业,经过一段时间,AB各自作业都使用了一半的资源
- 现在,如果B用户在其他作业未结束时开始了一个新的作业,他将与B的另一个作业共享其资源,因此用户B的每个作业将拥有资源的四分之一,而用户A将继续拥有一半的资源。
- 最终结果表名:资源在用户之间实现了公平的共享
- Fair Scheduler叫做公平调度,提供了YARN应用程序公平地共享大型集群中资源的另一种方式。使所有应用在平 均情况下随着时间的流逝可以获得相等的资源份额。
- Fair Scheduler设计目标是为所有的应用分配公平的资源(对公平的定义通过参数来设置)
- 在多个队列间工作,允许资源共享和抢占
优势:
- 分层队列:队列可以按层次结构排列以划分资源,并可以配置权重以按特定比例共享集群。
- 基于用户或组的队列映射:可以根据提交任务的用户名或组来分配队列。任务指定了某个队列,就在该队列中提交任务
- 资源抢占:根据应用的配置,抢夺和分配资源可以是友好的或是强制的。默认不启用资源抢占。
- 保证最小配额:可以设置队列最小资源,允许将保证的最小份额分配给队列,保证用户可以启动任务。当队列不能满足最小资源时,可以从其他队列抢占。当队列资源使用不完时,可以给其他队列使用。这对于确保某些用户、组或生产应用始终获得足够的资源。
- **允许资源共享:**即当一个应用运行时,如果其他队列没有任务执行,则可以使用其他队列,当其他队列有应用需要资源时,再将占用的队列释放出来。所有的应用都从资源队列中分配资源。
- 默认不限制每个队列和用户同时运行应用的数量:可以通过配置来限制队列和用户并行执行的应用数量。限制并行执行应用的数量不会导致任务提交失败,超出的应用会在队列中等待。