本文基于Hadoop 3.X
简介
Hadoop YARN 是 Hadoop 分布式计算框架中的资源管理和作业调度器。作为 Apache Hadoop 的核心组件之一,YARN负责Hadoop集群中的服务器资源管理 (Resource Management),以及对计算任务调度与监控 (Scheduling / Monitoring)。
The fundamental idea of YARN is to split up the functionalities of resource management and job scheduling/monitoring into separate daemons. The idea is to have a global ResourceManager and per-application ApplicationMaster. An application is either a single job or a DAG of jobs.
系统架构
YARN主要包含 ResourceManager,NodeManager,ApplicationMaster 以及 Container 等核心组件。
ResourceManager
ResourceManager 为全局资源管理器,负责整个系统的资源管理和分配。它主要由两个组件构成:调度器 (Scheduler) 和应用程序管理器 (Applications Manager)。主要功能如下:
- 处理客户端请求
- 监控NodeManager
- 启动和监控ApplicationMaster
- 资源分配与调度
Scheduler
调度器根据计算任务对资源的需求以及系统容量、队列等约束等条件将一定资源分配给对应的计算程序。 每一个应用程序需要不同类型的资源(不同的容器),其中资源包括:内存、CPU、磁盘、网络等。YARN提供多种直接可用的调度器,比如FIFO调度器, 容量调度器 (Capacity Scheduler),公平调度器 (Fair Scheduler) 等。
ApplicationsManager
应用程序管理器 (ApplicationManager) 负责整个系统中应用程序的全生命周期管理,包括应用程序提交、与调度器协调资源以启动ApplicationMaster、监控ApplicationMaster运行状态并在失败时重启等。
ApplicationMaster
用户提交的每个计算程序均包含一个ApplicationMaster,在 MapReduce 或 Spark 中也称为Driver
,其主要功能包括:
- 与 ResourceManager 协调资源 (用Container表示)
- 将任务进一步细分并分发给内部的并行计算逻辑
- 与 NodeManager 通信 (RPC) 以启动 / 停止任务
- 监控所有任务运行状态,当任务失败时负责容错与重试
NodeManager
NodeManager 是集群中每个节点上的资源和任务管理器,主要功能包括:
- 管理单个节点上的资源
- 处理源自 ResourceManager 的命令
- 处理源自 ApplicationMaster 的命令
Container
Container 是 YARN 中资源的抽象,它封装了节点上多维度的资源,如内存、CPU、磁盘、网络等。当 AM 向 RM 申请资源时,RM 为 AM 返回的资源以Container表示的。
- 对计算任务运行环进行抽象
- 封装多维度资源(如内存空间,CPU核数等)
工作机制
基础流程图
流程简述
客户端向YARN提交计算任务,其中包括 ApplicationMaster(驱动)程序,启动ApplicationMaster的命令/参数和用户程序资源等。
ResourceManager 审核通过之后,会基于调度策略协调相应的 NodeManager 提供一个 Contaienr 以启动运行计算应用的 ApplicationMaster。
ApplicationMaster 启动后向 ResourceManager 注册,用户随后即可通过 ResourceManager 查看应用程序的运行状态,随后它将为各个任务申请资源,并监控它的运行状态,直到运行结束。
ApplicationMaster 采用轮询的方式通过 RPC 向 ResourceManager 申请和认领资源 (Container) 。ResourceManager 同样将根据调度策略协调分配Container。
当 ApplicationMaster 获取资源后,立即与对应的 NodeManager 通信,请求启动计算任务。
NodeManager 为任务设置 Container 运行环境后,将任务启动命令/参数写到脚本中,并通过运行该脚本启动任务。
各个任务通过某个 RPC 协议向 ApplicationMaster 汇报自己的状态和进度,ApplicationMaster 随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务;在应用程序运行过程中,用户可随时通过 RPC 向 ApplicationMaster 查询计算程序的当前运行状态。
应用程序运行完成后,Container清理资源,ApplicationMaster 向 ResourceManager 注销并关闭。
资源调度器
目前 Hadoop-YARN 有3种常见的调度器,分别为FIFO,Capacity Scheduler 和 Fair Scheduler。Apache Hadoop 3.1 默认资源调度器为 Capacity Scheduler。细节可参考 yarn-default.xml
文件。
FIFO
FIFO 为 First In First Out 类型单队列,先按照作业的优先级高低,再按照提交时间的先后顺序选择被执行的作业。生产环境中一般不会使用该调度器。
Capacity Scheduler
容量调度器使用深度优先算法,优先选择资源占用率最低的队列分配资源。作业默认按照优先级和提交时间顺序开启。
多队列,支持多个不同配置的队列,可采用 FIFO 或 DRF (Dominant Resource Fairness) 策略。
容量保证,可为每个队列配置资源最低保证 (capacity) 和资源上限 (maximum-capacity)。
弹性分配,若一个或多个队列中有资源剩余,可暂时共享给其余等待资源的队列。一旦本队列有计算任务提交,则相应资源将从借调的队列中归还。
支持多租户,多用户可共享集群资源/多个计算任务同时运行。为防止单用户独占队列全部资源,可限制用户提交作业所占资源比例 (user-limit-factor)。
安全,每个队列有严格的访问控制。相关用户只能向自己的队列中提交任务,且不能修改或者访问其他队列的任务。
Fair Scheduler
公平调度器在整个时间线上,所有的任务平均获取资源。默认情况下,公平调度器只是对内存资源做公平的调度和分配。若集群中只有一个任务在运行时,那么此任务会占用整个集群的资源。当其他的任务提交后,那些释放的资源将会被分配给新的任务,最终使得每个任务都能获取几乎一样多的资源。
- 调度策略:优先选择对资源的缺额较大的任务。
- 多队列:支持多个不同配置的队列,且均可配置不同策略。每个队列可以采用FIFO, Fair, DRF。
- 弹性分配,若一个或多个队列中有资源剩余,可暂时共享给其余等待资源的队列。
- 支持多租户,多用户可共享集群资源/多个计算任务同时运行。
- 安全,每个队列有严格的访问控制。相关用户只能向自己的队列中提交任务,且不能修改或者访问其他队列的任务。
关键特征
Feature | Description |
---|---|
Multi-tenancy | Yarn allows multiple engine access and fulfills the computing requirement within/across the cluster and each process can be isolated. Supports multiple scheduling mode such as FIFO, Capacity Scheduler, Fair Scheduler. |
Sharing Resources | Yarn ensures no dependency between the compute jobs. Each compute job runs on its own node and does not share its allocated resources. Each job is responsible for its own assigned work. |
Cluster Utilization | Yarn optimizes the cluster by utilizing and allocating system resources in a dynamic manner. |
Fault Tolerance | Yarn allows the rescheduling of the failed to compute jobs without any implications for the final output. |
Scalability | Yarn focuses mainly on scheduling the resources. This creates a pathway for expanding the data nodes and increasing the processing capacity. |
Compatibility | Yarn is compatible for multiple computing jobs such as MapReduce, Spark and Flink. |
其他信息
RM的高可用
ResourceManager采用高可用架构,基于 ZooKeeper 实现 Active 状态的单个节点和 Standby 的多个ResourceManager之间的自动故障切换。 ^1
同时可通过checkpoint机制,定时将状态保存至磁盘,在失败的时候,重新运行。
YARN-FailOver
任务失败
- 运行时异常或者JVM退出都会报告给 ApplicationMaster。
- 通过心跳检查任务的timeout,多次检查(可配置)以判断该任务是否存活。
- 失败的任务或者作业都由 ApplicationMaster 失败重新运行。
ApplicationMaster失败
ApplicationMaster 定时发送心跳给 ResourceManager,一旦运行失败或心跳中断,则认定核心
Driver
执行失败(可配置多次)。ApplicationMaster 失败后,ResourceManager 可启动一个新的,随后新
Driver
将负责恢复状态(如 Spark 中的checkpoint机制)。
NodeManager失败
- NodeManager 定时发送心跳给 ResourceManager,如果超过一段时间没有收到心跳消息,ResourceManager 会将其移除。
- 任何运行在该 NodeManager 上的任务和 ApplicationMaster 都会在其他 NodeManager 上进行恢复。
- 若某个 NodeManager 失败的次数太多,ApplicationMaster 会将其加入黑名单,任务调度时不在其上运行任务。