赞
踩
Apache Hadoop YARN (Yet Another Resource Negotiator,另一种资源协调者)是一种新的 Hadoop 资源管理器,它是一个通用资源管理系统和调度平台,可为上层应用提供统一的资源管理和调度,它的引入为集群在利用率、资源统一管理和数据共享等方面带来了巨大好处。
YARN 是一个资源管理、任务调度的框架,主要包含三大模块:ResourceManager(RM)、NodeManager(NM)、ApplicationMaster(AM)
ResourceManager # 负责所有应用程序(整个集群)资源分配与管理 以及接收作业的提交;
ApplicationMaster # 负责每一个应用程序的资源分配(资源二次分配)以及监控所有任务的运行状态;
NodeManager # 负责每一个节点的维护;
备注:一个节点上可以运行多个应用程序,一个应用程序可以有多个运行任务
1.ResourceManager
对于所有的应用程序,ResourceManager 拥有绝对的控制权和对资源的分配权。而每个 ApplicationMaster 则会和 ResourceManager 协商资源,同时和 NodeManager 通信来执行和监控task
ResourceManager 负责整个集群的资源管理和分配,是一个全局的资源管理系统。NodeManager 以心跳的方式向 ResourceManager 汇报资源使用情况(目前主要是 CPU 和内存的使用情况)。
ResourceManager 只接受 NodeManager 的资源回报信息,对于具体的资源处理则交给 NodeManager 自己处理。
Scheduler 根据 application 的请求为其分配资源,不负责 application job 的监控、追踪、运行状态反馈、启动等工作,这些都交给 ApplicationMaster。
ResourceManager 由两个关键组件 Scheduler 和 ApplicationsManager 组成。
Scheduler:在容量和队列限制范围内负责为运行的容器分配资源。Scheduler是一个纯调度器(pure scheduler),只负责调度,
它不会监视或跟踪应用程序的状态,也不负责重启失败任务,这些全都交给ApplicationMaster完成。Scheduler根据各个应用程序的资源需求进行资源分配。
ApplicationsManager:负责接收作业的提交,然后启动一个ApplicationMaster容器来负责该应用。它也会在ApplicationMaster容器失败时,重新启动ApplicationMaster容器。
2.ApplicationMaster
用 户 提 交 的 每 个 应 用 程 序 均 包 含 一 个 ApplicationMaster , 它 可 以 运 行 在 ResourceManager 以外的机器上。负责与 ResourceManager 调度器协商以获取 资源(Container)。
将得到的资源进一步分配给内部的任务(资源的二次分配)。与 NodeManager 通信以启动/停止任务。监控所有任务运行状态,并在任务运行失败时,重新为任务申请资源以重启任务。
当前 YARN 自带了两个 ApplicationMaster 实现,一个是用于演示 ApplicationMaster 编写方法的实例程序 DistributedShell,它可以申请一定数目的 Container 以并行运行一个 Shell 命令或者 Shell 脚本;
另一个是运行 MapReduce 应用程序的 AM—MRAppMaster。
Container:是 YARN 中的资源抽象,它封装了某个节点上的多维度资源,如内存、CPU、磁盘、网络等,
当 AM 向RM 申请资源时,ResourceManager 为 ApplicationMaster 返回的资源便是用 Container 表示的(yarn中分配资源的一个单位),YARN会为每个任务分配一个Container,且该任务只能使用该Container中描述的资源。
3.NodeManager
NodeManager 是每个节点上的资源和任务管理器,它是这台机器的代理,负责该节点程序的运行,以及该节点资源的管理和监控。YARN 集群每个节点都运行一个 NodeManager。
NodeManager 定时向 ResourceManager 汇报本节点资源(CPU、内存)的使用情况和 Container 的运行状态。当 ResourceManager 宕机时 NodeManager 自动连接 ResourceManager 备用节点。
NodeManager 接收并处理来自 ApplicationMaster 的 Container 启动、停止等各种请求。
步骤1: 用户向YARN中提交应用程序,其中包括ApplicationMaster程序、启动ApplicationMaster的命令、用户程序等。
步骤2: ResourceManager为该应用程序分配第一个Container,并与对应的Node-Manager通信,要求它在这个Container中启动应用程序的ApplicationMaster。
步骤3: ApplicationMaster首先向ResourceManager注册,这样用户可以直接通过ResourceManager查看应用程序的运行状态,然后它将为各个任务申请资源,并监控它的运行状态,直到运行结束,即重复步骤4~7。
步骤4: ApplicationMaster采用轮询的方式通过RPC协议向ResourceManager申请和领取资源。
步骤5: 一旦ApplicationMaster申请到资源后,便与对应的NodeManager通信,要求它启动任务。
步骤6: NodeManager为任务设置好运行环境(包括环境变量、JAR包、二进制程序等)后,将任务启动命令写到一个脚本中,并通过运行该脚本启动任务。
步骤7: 各个任务通过某个RPC协议向ApplicationMaster汇报自己的状态和进度,以让ApplicationMaster随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务。
在应用程序运行过程中,用户可随时通过RPC向ApplicationMaster查询应用程序的当前运行状态。
步骤8: 应用程序运行完成后,ApplicationMaster向ResourceManager注销并关闭自己。
理想情况下,我们应用对 Yarn 资源的请求应该立刻得到满足,但现实情况资源往往是有限的,特别是在一个很繁忙的集群,一个应用资源的请求经常需要等待一段时间才能的到相应的资源。
在 Yarn 中,负责给应用分配资源的就是 Scheduler。其实调度本身就是一个难题,很难找到一个完美的策略可以解决所有的应用场景。为此,Yarn 提供了多种调度器和可配置的策略供我们选择。
在 Yarn 中有三种调度器可以选择:FIFO Scheduler ,Capacity Scheduler,Fair Scheduler。
1.FIFO Scheduler
FIFO Scheduler 把应用按提交的顺序排成一个队列,这是一个 先进先出队列,在进行资源分配的时候,先给队列中最头上的应用进行分配资源,待最头上的应用需求满足后再给下一个分配,以此类推。
FIFO Scheduler 是最简单也是最容易理解的调度器,也不需要任何配置,但它并不适用于共享集群。大的应用可能会占用所有集群资源,这就导致其它应用被阻塞。(小任务会被大任务阻塞)
在共享集群中,更适合采用 Capacity Scheduler 或 Fair Scheduler,这两个调度器都允许大任务和小任务在提交的同时获得一定的系统资源。
2.Capacity Scheduler
对于Capacity调度器,有一个专门的队列用来运行小任务,但是为小任务专门设置一个队列会预先占用一定的集群资源,这就导致大任务的执行时间会落后于使用FIFO调度器时的时间。
在每一个队列内部,资源的调度是采用的是先进先出策略。
3.Fair Scheduler
Fair 调度器的设计目标是为所有的应用分配公平的资源(对公平的定义可以通过参数来设置)。一个队列中两个应用的公平调度;当然,公平调度在也可以在多个队列间工作。
举个例子,假设有两个用户A和B,他们分别拥有一个队列。当A启动一个job而B没有任务时,A会获得全部集群资源;当B启动一个job后,A的job会继续运行,不过一会儿之后两个任务会各自获得一半的集群资源。
如果此时B再启动第二个job并且其它job还在运行,则它将会和B的第一个job共享B这个队列的资源,也就是B的两个job会用于四分之一的集群资源,而A的job仍然用于集群一半的资源,结果就是资源最终在两个用户之间平等的共享。
在Fair调度器中,我们不需要预先占用一定的系统资源,Fair调度器会为所有运行的job动态的调整系统资源。当第一个大job提交时,只有这一个job在运行,此时它获得了所有集群资源;
当第二个小任务提交后,Fair调度器会分配一半资源给这个小任务,让这两个任务公平的共享集群资源。
a) 公平调度器,就是能够共享整个集群的资源
b) 不用预先占用资源,每一个作业都是共享的
c) 每当提交一个作业的时候,就会占用整个资源,如果再提交一个作业,那么第一个作业就会分给第二个作业一部分资源,第一个作业也就释放一部分资源。再提交其他的作业时,也同理...也就是说每一个作业进来,都有机会获取资源。
需要注意的是,从第二个任务提交到获得资源会有一定的延迟,因为它需要等待第一个任务释放占用的 Container。小任务执行完成之后也会释放自己占用的资源,大任务又获得了全部的系统资源。
最终效果就是 Fair 调度器即得到了高的资源利用率又能保证小任务及时完成。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。