2.2 Apache YARN
YARN 是 Apache Hadoop 的子项目,并未从 Hadoop 分离成独立项目。
2.2.1 基本原理
简介
YARN 是 Hadoop2.0 中的资源管理系统,是一个通用的资源管理模块,可以为各类应用程序进行资源管理和调度。YARN 并不局限于 MapReduce,也可以供其他框架使用,比如 Tez、Spark、Storm 等。YARN 类似于资源管理系统 Mesos 和更早的 Torque。
在最早的 Hadoop MapReduce 计算架构中,进行作业调度时使用 FIFO Scheduler。FIFO 是指,所有用户的作业都被提交到一个队列中,然后按照作业的优先级,再按照作业提交时间的先后顺序选择将被执行的作业。 Hadoop 中只有一个作业队列,被提交的作业按照先后顺序在作业队列中排队,新来的作业插入到队尾。一个作业运行完成后,总是从队首取下一个作业运行。 这种调度策略的优点是简单、易于实现,同时也减轻了 JobTracker 的负担。缺点是,它没有考虑到作业的紧迫程度,另外对小作业的运行不利。因此,逐 渐衍生出可以分配资源的 Superior Scheduler 和 Capacity Scheduler。
结构
YARN 模型主要由 ResourceManager、ApplicationMaster 和 NodeManager 组成,如下 图 1 所示。
图 1 Apache YARN 的基本架构
表格 6 YARN 结构图说明
名称 | 描述 |
---|---|
Client | YARN Application 客户端,用户可以通过客户端向 ResourceManager 提交任务,查询 Application 运行状态等。 |
ResourceManager(RM) | 负责集群中所有资源的统一管理和分配。接收来自各个节点(NodeManager)的资源汇报信息,并根据收集的资源按照一定的策略分配给各个应用程序。 |
NodeManager(NM) | NodeManager(NM)是 YARN 中每个节点上的代理,管理 Hadoop 集群中单个计算节点,包括与 ResourceManger 保持通 信,监督 Container 的生命周期管理,监控每个 Container 的资源使用(内存、CPU 等)情况,追踪节点健康状况,管理日志和不同应用程序用 到的附属服务(auxiliary service)。 |
ApplicationMaster(AM) | 即图中的 App Mstr,负责一个 Application 生命周期内的所有工作。包括:与 RM 调度器协商以获取资源;将得到的资源进一步分配给内部任务(资源的二次分 配);与 NM 通信以启动/停止任务;监控所有任务运行状态,并在任务运行失败时重新为任务申请资源以重启任务。 |
Container | Container 是 YARN 中的资源抽象,封装了某个节点上的多维度资源,如内存、CPU、磁盘、网络等(目前仅封装内存和 CPU),当 AM 向 RM 申请资源时,RM 为 AM 返回的资源便是用 Container 表示。YARN 会为每个任务分配一个 Container,且该任务只能使用该 Container 中描述的资源。 |
在 YARN 中,资源调度器是以层级队列方式组织资源的,这种组织方式有利于资源在不同队列间分配和共享,进而提高集群资源利用率。如下图所示,Superior Scheduler 和 Capacity Scheduler 的核心资源分配模型相同。
调度器会维护队列的信息。用户可以向一个或者多个队列提交应用。每次 NM 心跳的时候,调度器会根据一定规则选择一个队列,再选择队列上的一个应用, 并尝试在这个应用上分配资源。若因参数限制导致分配失败,将选择下一个应用。选择一个应用后,调度器会处理此应用的资源申请。其优先级从高到低依次为:本 地资源的申请、同机架的申请,任意机器的申请。
图 YARN 资源分配模型
原理
新的 Hadoop MapReduce 框架被命名为 MRv2 或 YARN。YARN 主要包括 ResourceManager、ApplicationMaster 与 NodeManager 三个部分。
- ResourceManager:RM 是一个全局的资源管理器,负责整个系统的资源管理和分配。主要由两个组件构成:调度器(Scheduler)和应用程序管理器(Applications Manager)。
- 调度器根据容量、队列等限制条件(如每个队列分配一定的资源,最多执行一定数量的作业等),将系统中的资源分配给各个正在运行的应用程序。调度器 仅根据各个应用程序的资源需求进行资源分配,而资源分配单位用一个抽象概念 Container 表示。Container 是一个动态资源分配单位,将内存、 CPU、磁盘、网络等资源封装在一起,从而限定每个任务使用的资源量。此外,该调度器是一个可插拔的组件,用户可根据自己的需要设计新的调度器,YARN 提供了多种直接可用的调度器,比如 Fair Scheduler 和 Capacity Scheduler 等。
- 应用程序管理器负责管理整个系统中所有应用程序,包括应用程序提交、与调度器协商资源以启动 ApplicationMaster、监控 ApplicationMaster 运行状态并在失败时重新启动等。
- NodeManager:NM 是每个节点上的资源和任务管理器,一方面,会定时向 RM 汇报本节点上的资源使用情况和各个 Container 的运行状态;另一方面,接收并处理来自 AM 的 Container 启动/停止等请求。
- ApplicationMaster:AM 负责一个 Application 生命周期内的所有工作。包括:
- 与 RM 调度器协商以获取资源。
- 将得到的资源进一步分配给内部的任务(资源的二次分配)。
- 与 NM 通信以启动/停止任务。
- 监控所有任务运行状态,并在任务运行失败时重新为任务申请资源以重启任务。
Capacity Scheduler 原理
Capacity Scheduler 是一种多用户调度器,它以队列为单位划分资源,为每个队列设定了资源最低保证和使用上限。同时,也为每个用户设定了资源使用上限以防止资源滥用。而当一个队列的资源有剩余时,可暂时将剩余资源共享给其他队列。
Capacity Scheduler 支持多个队列,为每个队列配置一定的资源量,并采用 FIFO 调度策略。为防止同一用户的应用独占队列资源,Capacity Scheduler 会对同一用户提交的作业所占资源量进行限定。调度时,首先计算每个队列使用的资源,选择使用资源最少的队列;然后按照作业优先级和提交 时间顺序选择,同时考虑用户资源量的限制和内存限制。Capacity Scheduler 主要有如下特性:
- 容量保证。管理员可为每个队列设置资源最低保证和资源使用上限,而所有提交到队列的应用程序共享这些资源。
- 灵活性。如果一个队列中的资源有剩余,可以暂时共享给那些需要资源的队列,而一旦该队列有新的应用程序提交,则占用资源的队列将资源释放给该队列。这种资源灵活分配的方式可明显提高资源利用率。
- 多重租赁。支持多用户共享集群和多应用程序同时运行。为防止单个应用程序、用户或者队列独占集群中的资源,管理员可为之增加多重约束(比如单个应用程序同时运行的任务数等)。
- 安全保证。每个队列有严格的 ACL 列表规定它的访问用户,每个用户可指定哪些用户允许查看自己应用程序的运行状态或者控制应用程序。此外,管理员可指定队列管理员和集群系统管理员。
- 动态更新配置文件。管理员可根据需要动态修改配置参数以实现在线集群管理
- Capacity Scheduler 中每个队列可以限制资源使用量。队列间的资源分配以使用量作为排列依据,使得容量小的队列有竞争优势。集群整体吞吐较大,延迟调度机制使得应用可以有机会放弃跨机器或者跨机架的调度,争取本地调度。
2.2.2 与组件的关系
Spark 和 YARN 的配合关系
Spark 的计算调度方式,可以通过 YARN 的模式实现。Spark 共享 YARN 集群提供丰富的计算资源,将任务分布式的运行起来。Spark on YARN 分两种模式:YARN Cluster 和 YARN Client。
· YARN Cluster 模式
运行框架如 图 1 所示。
图 1 Spark on yarn-cluster 运行框架
Spark on yarn-cluster 实现流程:
- 首先由客户端生成 Application 信息,提交给 ResourceManager。
- ResourceManager 为 Spark Application 分配第一个 Container(ApplicationMaster),并在该 Container 上启动 Driver。
- ApplicationMaster 向 ResourceManager 申请资源以运行 Container。
ResourceManager 分配 Container 给 ApplicationMaster,ApplicationMaster 和相关的 NodeManager 通讯,在获得的 Container 上启动 Executor,Executor 启动后,开始向 Driver 注册并申请 Task。 - Driver 分配 Task 给 Executor 执行。
- Executor 执行 Task 并向 Driver 汇报运行状况。
· YARN Client 模式
运行框架如 图 2 所示。
图 2 Spark on yarn-client 运行框架
Spark on yarn-client 实现流程:
说明:
在 yarn-client 模式下,Driver 部署在 Client 端,在 Client 端启动。yarn-client 模式下,不兼容老版本的客户端。推荐使用 yarn-cluster 模式。
- 客户端向 ResourceManager 发送 Spark 应用提交请求,ResourceManager 为其返回应答,该应答中包含多种信息(如 ApplicationId、可用资源使用上限和下限等)。Client 端将启动 ApplicationMaster 所需的所有信息打包,提交给 ResourceManager 上。
- ResourceManager 收到请求后,会为 ApplicationMaster 寻找合适的节点,并在该节点上启动它。ApplicationMaster 是 Yarn 中的角色,在 Spark 中进程名字是 ExecutorLauncher。
- 根据每个任务的资源需求,ApplicationMaster 可向 ResourceManager 申请一系列用于运行任务的 Container。
- 当 ApplicationMaster(从 ResourceManager 端)收到新分配的 Container 列表后,会向对应的 NodeManager 发送信息以启动 Container。
ResourceManager 分配 Container 给 ApplicationMaster,ApplicationMaster 和相关的 NodeManager 通讯,在获得的 Container 上启动 Executor,Executor 启动后,开始向 Driver 注册并申请 Task。
- Driver 分配 Task 给 Executor 执行。Executor 执行 Task 并向 Driver 汇报运行状况。
MapReduce 和 YARN 的配合关系
MapReduce 是运行在 YARN 之上的一个批处理的计算框架。MRv1 是 Hadoop 1.0 中的 MapReduce 实现,它由编程模型(新旧编程接口)、运行时环境(由 JobTracker 和 TaskTracker 组成)和数据处理引擎 (MapTask 和 ReduceTask)三部分组成。该框架在扩展性、容错性(JobTracker 单点)和多框架支持(仅支持 MapReduce 一种 计算框架)等方面存在不足。MRv2 是 Hadoop 2.0 中的 MapReduce 实现,它在源码级重用了 MRv1 的编程模型和数据处理引擎实现,但运行时环境由 YARN 的 ResourceManager 和 ApplicationMaster 组成。其中 ResourceManager 是一个全新的资源管理系统,而 ApplicationMaster 则负责 MapReduce 作业的数据切分、任务划分、资源申请和任务调度与容错等工作。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论