yarn 概述

Apache Yarn(Yet Another Resource Negotiator的缩写)是 hadoop 集群资源管理器系统,Yarn 从 hadoop 2 引入,最初是为了改善 MapReduce 的实现,但是它具有通用性,同样执行其他分布式计算模式。

在 MapReduce1 中,具有如下局限性:

  • 扩展性差:jobtracker 兼顾资源管理和作业控制跟踪功能跟踪任务,启动失败或迟缓的任务,记录任务的执行状态,维护计数器),压力大,成为系统的瓶颈

  • 可靠性差:采用了 master/slave 结构,master 容易单点故障

  • 资源利用率低:基于槽位的资源分配模型,槽位是一种粗粒度的资源划分单位,通常一个任务不会用完一个槽位的资源,hadoop1 分为 map slot 和 reduce slot,而它们之间资源不共享,造成一些资源空闲。

  • 不支持多:不支持多种计算框架并行。

yarn 很好解决了 MapReduce1 中的局限性:yarn 基本思想:一个全局的资源管理器ResourceManager和与每个应用对应的ApplicationMaster,Resourcemanager 和 NodeManager 组成全新的通用系统,以分布式的方式管理应用程序。

所以针对 MapReduce1,Yarn 就有了如下特点

  • 支持非 MapReduce 应用的需求

  • 可扩展性

  • 提高资源使用率

  • 用户敏捷性

  • 可以通过搭建为高可用

yarn 架构组件

Yarn 从整体上还是属于 master/slave 模型,主要依赖于三个组件来功能,第一个就是 ResourceManager,是集群资源的仲裁者,它包括两部分:一个是可插拔式的调度 Scheduler,一个是 ApplicationManager,用于管理集群中的用户作业。第二是每个节点上的 NodeManager,管理该节点上的用户作业和工作流,也会不断发送自己 Container 使用情况ResourceManager。第三个组件是 ApplicationMaster,用户作业生命周期的管理者它的主要功能就是向 ResourceManager(全局的)申请计算资源(Containers)并且和 NodeManager 交互来执行和监控具体task。架构图如下:

2.1、Resourcemanager

ResourceManager 拥有系统所有资源分配的决定权,负责集群中所有应用程序的资源分配,拥有集群资源主要、全局视图。因此为用户提供公平的,基于容量的,本地化资源调度。根据程序的需求,调度优先级以及可用资源情况,动态分配特定节点运行应用程序。它与每个节点上的 NodeManager每一个应用程序ApplicationMaster 协调工作。

ResourceManager 的主要职责在于调度,即在竞争的应用程序之间分配系统中的可用资源,并不关注每个应用程序的状态管理。

ResourceManager主要有两个组件:Scheduler和ApplicationManager:Scheduler 是一个资源调度器,它主要负责协调集群中各个应用的资源分配,保障整个集群的运行效率。Scheduler 的角色是一个纯调度器,它只负责调度 Containers,不会关心应用程序监控及其运行状态等信息。同样,它也不能重启因应用失败或者硬件错误而运行失败的任务。

2.1.1、Scheduler

Scheduler是一个可插拔的插件,负责各个运行中的应用的资源分配,受到资源容量,队列以及其他因素的影响。是一个纯粹的调度器,不负责应用程序的监控和状态追踪,不保证应用程序的失败或者硬件失败的情况对task重启,而是基于应用程序的资源需求执行其调度功能,使用了叫做资源 container 的概念,其中包括多种资源,比如,cpu,内存,磁盘,网络等。在 Hadoop 的 MapReduce 框架中主要有三种Scheduler:FIFO Scheduler,Capacity Scheduler 和 Fair Scheduler。

  • FIFO Scheduler:先进先出,不考虑作业优先级和范围,适合低负载集群。

  • Capacity Scheduler:将资源分为多个队列,允许共享集群,有保证每个队列最小资源的使用。

  • Fair Scheduler:公平的将资源分给应用的方式,使得所有应用在平均情况下随着时间得到相同的资源份额。

2.1.2、ApplicationManager

ApplicationManager 主要负责接收 job 的提交请求,为应用分配第一Container 来运行 ApplicationMaster,还有就是负责监控 ApplicationMaster,在遇到失败时重启 ApplicationMaster 运行的 Container。

2.2、NodeManager

NodeManager 是 yarn 节点的一个“工作进程”代理,管理 hadoop 集群中独立的计算节点,主要负责与 ResourceManager 通信,负责启动和管理应用程序的 container 的生命周期,监控它们的资源使用情况( cpu 和内存),跟踪节点的监控状态,管理日志等。并报告给RM。

NodeManager 在启动时,NodeManager 向 ResourceManager 注册,然后发送心跳包来等待 ResourceManager 的指令,主要目的是管理 resourcemanager 分配给它的应用程序 container。NodeManager 只负责管理自身的 Container,它并不知道运行在它上面应用的信息。在运行期,通过 NodeManager 和 ResourceManager 协同工作,这些信息会不断被更新并保障整个集群发挥出最佳状态。

主要职责:
1、接收 ResourceManager 的请求,分配 Container 给应用的某个任务
2、和 ResourceManager 交换信息以确保整个集群平稳运行。ResourceManager 就是通过收集每个NodeManager的报告信息来追踪整个集群健康状态的,而 NodeManager 负责监控自身的健康状态。
3、管理每个 Container 的生命周期
4、管理每个节点上的日志
5、执行 Yarn 上面应用的一些额外的服务,比如 MapReduce 的 shuffle 过程。

2.2.1、Container

Container 是 Yarn 框架的计算单元,是具体执行应用 task(如map task、reduce task)的基本单位。Container 和集群节点的关系是:一个节点会运行多个 Container,但一个 Container 不会跨节点。

一个 Container 就是一组分配的系统资源,现阶段只包含两种系统资源(之后可能会增加磁盘、网络、GPU等资源),由 NodeManager 监控,Resourcemanager 调度。

每一个应用程序从 ApplicationMaster 开始,它本身就是一个 Container(第0个),一旦启动,ApplicationMaster 就会更加任务需求与 Resourcemanager 协商更多的 Container,在运行过程中,可以动态释放和申请 Container。

2.3、ApplicationMaster

ApplicationMaster 负责与 Scheduler 协商合适的 Container,跟踪应用程序的状态,以及监控它们的进度,ApplicationMaster 是协调集群中应用程序执行的进程。每个应用程序都有自己的 ApplicationMaster,负责与 ResourceManager 协商资源(container)和 NodeManager 协同工作来执行和监控任务 。

当一个 ApplicationMaster 启动后,会周期性的向 ResourceManager 发送心跳报告来确认其健康和所需的资源情况,在建好的需求模型中,ApplicationMaster 在发往 ResourceManager 中的心跳信息中封装偏好和限制,在随后的心跳中, ApplicationMaster 会对收到集群中特定节点上绑定了一定的资源的 Container 的租约,根据 ResourceManager 发来的 Container,ApplicationMaster 可以更新它的执行计划以适应资源不足或者过剩,Container 可以动态的分配和释放资源。

yarn 作业调度流程

Application 在 Yarn 中的执行过程如下图所示:

1、客户端程序向 ResourceManager 提交应用并请求一个 ApplicationMaster 实例, ResourceManager 在应答中给出一个 applicationId 以及有助于客户端请求资源的资源容量信息。

2、ResourceManager 找到可以运行一个 Container 的 NodeManager,并在这个 Container 中启动 ApplicationMaster 实例。

Application Submission Context 发出响应,其中包含有:ApplicationId,用户名,队列以及其他启动 ApplicationMaster 的信息。

Container Launch Context(CLC)也会发给 ResourceManager,CLC提供了资源的需求,作业文件,安全令牌以及在节点启动 ApplicationMaster 所需要的其他信息。

当 ResourceManager 接收到客户端提交的上下文,就会给 ApplicationMaster 调度一个可用的 Container(通常称为container0)。然后ResourceManager就会联系 NodeManager 启动 ApplicationMaster,并建立 ApplicationMaster 的 RPC 端口和用于跟踪的 URL ,用来监控应用程序的状态。

3、ApplicationMaster 向 ResourceManager 进行注册,注册之后客户端就可以查询 ResourceManager 获得自己 ApplicationMaster 的详细信息,以后就可以和自己的 ApplicationMaster 直接交互了。在注册响应中,ResourceManager 会发送关于集群最大和最小容量信息。

4、在平常的操作过程中,ApplicationMaster根据resource-request协议向ResourceManager发送resource-request请求,ResourceManager会根据调度策略尽可能最优的为ApplicationMaster分配container资源,作为资源请求的应答发个ApplicationMaster。

5、当Container被成功分配之后,ApplicationMaster通过向NodeManager发送container-launch-specification信息来启动Container, container-launch-specification信息包含了能够让Container和ApplicationMaster交流所需要的资料,一旦container启动成功之后,ApplicationMaster就可以检查他们的状态,Resourcemanager不在参与程序的执行,只处理调度和监控其他资源,Resourcemanager可以命令NodeManager杀死container。

6、应用程序的代码在启动的Container中运行,并把运行的进度、状态等信息通过application-specific协议发送给ApplicationMaster,随着作业的执行,ApplicationMaster将心跳和进度信息发给ResourceManager,在这些心跳信息中,ApplicationMaster还可以请求和释放一些container。

7、在应用程序运行期间,提交应用的客户端主动和ApplicationMaster交流获得应用的运行状态、进度更新等信息,交流的协议也是application-specific协议。

8、一但应用程序执行完成并且所有相关工作也已经完成,ApplicationMaster向ResourceManager取消注册然后关闭,用到所有的Container也归还给系统,当container被杀死或者回收,Resourcemanager就会通知NodeManager聚合日志并清理container专用的文件。

总结

YARN 作为 HADOOP 生态圈的重要一员,YARN 在开源大数据领域有着重要的地位,很多计算框架都能够运行在 YARN 上,比如 Spark,Flink,Storm 等。对于大多数公司的大数据计算场景,采用 YARN 来管理集群,是一个比较常见的解决方案。

举报/反馈

IT小尚

380获赞 255粉丝
尚硅谷IT学习分享爱好者
科技领域创作者
关注
0
0
收藏
分享