YARN资源调度器

YARN资源调度器

  1. 随着Hadoop的普及,单个Hadoop集群的用户量越来越大,不同用户提交的应用程序往往具有不同的服务质量要求,典型的应用有以下几种:

    • 批处理作业。这种作业往往耗时较长,对完成时间一般没有严格要求,如数据挖掘、机器学习等方面的应用程序
    • 交互式作业。这种作业期望能及时返回结果,如用HIVE执行查询
    • 生产性作业。这种作业要求有一定量的资源保证,如统计值计算、垃圾数据分析等

1. 基本架构

  1. 资源调度器是YARN中最核心的组件之一,且是插拔式的,它定义了一整套接口规范以便用户可按照需要实现自己的调度器
  2. YARN自带FIFO、Capacity Scheduler和Fair Scheduler三种常用资源调度器,当然,用户可按照接口规范编写一个新的资源调度器,并通过简单的配置使它运行起来
  3. YARN的资源管理器实际上是一个事件处理器,它需要处理来自外部的6中Scheduler-EventType类型的事件,并根据事件的具体含义进行相应的处理,6种事件含义如下:
    • NODE_REMOVED:表示集群中移除了一个计算节点(可能是节点故障或者管理员主动移除),资源调度器收到该事件时需要从可分配资源总量中移除相应的资源
    • NODE_ADDED:表示集群中增加了一个计算节点,资源调度器收到该事件时需要将新增的资源量添加到可分配资源总量中
    • APPLICATION_ADDED:表示ResourceManager收到一个新的Application。通常而言,资源管理器需要为每个Application维护一个独立的数据结构,以便于统一管理和资源分配。资源管理器将该Application添加到响应的数据结构中
    • APPLICATION_REMOVED:表示一个Application运行结束(可能成功或失败),资源管理器将该Application从响应的数据结构中清除
    • CONTAINER_EXPIRED:当资源调度器将一个Container分配给某个Application-Master后,如果该ApplicationMaster在一定时间内没有使用该Container,则资源调度器会对该Container进行(回收后)再分配
    • NODE_UPDATE:ResourceManager收到NodeManager通过心跳机制汇报的信息后,会触发一个NODE_UPDATE事件,由于此时可能有新的Container得到释放,因此该事件会触发资源分配。也就是说,该事件是6个事件中最重要的事件,它会触发资源调度器最核心的资源分配机制

1.1 资源表示模型

  1. NodeManager启动时会向ResourceManager注册,注册信息中包含该节点可分配的CPU和内存总量,这两个值均可通过配置选项设置,具体如下:

    • yarn.nodemanager.resource.memory-mb:可分配的物理内存总量,默认是8G
    • yarn.nodemanager.vmem-pmem-ratio:任务使用单位物理内存量对应最多可使用的虚拟内存,默认值是2.1,表示使用1M的物理内存,最多可以使用2.1MB的虚拟内存总量
    • yarn.nodemanager.resource.cpu-vcores:可分配的虚拟CPU个数,默认是8。为了更细粒度地划分CPU资源和考虑到CPU性能差异,YARN允许管理员根据实际需要和CPU性能将每个物理CPU划分成若干个虚拟CPU,而管理员可为每个节点单独配置可用的虚拟CPU个数,且用户提交应用程序时,也可指定每个任务需要的虚拟CPU数
  2. YARN支持的调度语义:
    • 请求某个节点上的特定资源量
    • 请求某个特定机架上的特定资源量
    • 将某些节点加入(或移除)黑名单,不再为自己分配这些节点上的资源
    • 请求归还某些资源
  3. 不支持的调度语义:
    • 请求任意节点上的特定资源量
    • 请求任意机架上的特定资源量
    • 请求一组或几组符合某种特质的资源
    • 超细粒度资源。比如CPU性能要求、绑定CPU等
    • 动态调整Container资源,允许根据需要动态调整Container资源量

1.2 资源调度模型

  1. YARN采用了双层资源调度模型

    • 第一层中,ResourceManager中的资源调度器将资源分配给各个ApplicationMaster
    • 第二层中,ApplicationMaster再进一步将资源分配给它的内部任务
  2. YARN的资源分配过程是异步的,也就是说,资源调度器将资源分配给一个应用程序后,它不会立刻push给对应的ApplicationMaster,而是暂时放到一个缓冲区中,等待ApplicationMaster通过周期性的心跳主动来取(pull-based通信模型)
  3. YARN采用了增量资源分配机制(当应用程序申请的资源暂时无法保证时,为应用程序预留一个节点上的资源直到累计释放的空闲资源满足应用程序需求),这种机制会造成浪费,但不会出现饿死现象
  4. YARN资源调度器采用了主资源公平调度算法,DRF的基本设计思想则是将最大最小化公平算法应用于主资源上,进而将多维资源调度问题转化为单资源调度问题,即DRF总是最大化所有主资源中最小的

1.3 资源抢占模型

  1. 在资源调度器中,每个队列可设置一个最小资源量和最大资源量,其中,最小资源量是资源紧缺情况下每个队列需保证的资源量,而最大资源量则是极端情况下队列也不能超过的资源使用量
  2. 为了提高资源利用率,资源调度器(包括Capacity Scheduler和Fair Scheduler)会将负载较轻的队列的资源暂时分配给负载重的队列(即最小资源量并不是硬资源保证,当队列不需要任何资源时,并不会满足它的最小资源量,而是暂时将空闲资源分配给其他需要资源的队列),仅当负载较轻队列突然收到新提交的应用程序时,调度器才进一步将本属于该队列的资源分配给它。但由于此时资源可能正被其他队列使用,因此调度器必须等待其他队列释放资源后,才能将这些资源“物归原主”,这通常需要一段不确定的等待时间。为了防止应用程序等待时间过长,调度器等待一段时间后若发现资源并未得到释放,则进行资源抢占
  3. 仅当启用的调度器实现了PreemptableResourceScheduler接口,且参数yarn.resourcemanager.secheduler.monitor.enable的值被置为true(默认值为false)时,ResourceManager才启用资源抢占功能。资源抢占是通过第三方策略触发的,这些策略被实现成一些插拔式的组件类(实现SchedulingEditPolicy接口),并通过参数yarn.resourcemanager.schduler.monitor.policies指定(默认情况下,YARN提供了默认实现ProporitonalCapacityPreemptionPolicy)
  4. ResourceManager将依次遍历这些策略类,并由监控类SchedulingMonitor进一步封装它们,SchedulingMonitor将周期性调用策略类的editSchedule()函数,以决定抢占哪些Container的资源
  5. 在YARN中,资源抢占整个过程可概括为如下步骤:
    1. SchedulingEditPolicy探测到需要抢占的资源,将需要抢占的资源通过事件DROP_RESERVATION和PREEMPT_CONTAINER发送给ResourceManager
    2. ResourceManager调用ResourceScheduler的dropContainerReservation和preemptContainer函数,标注待抢占的Container
    3. ResourceManager收到来自ApplicationMaster的心跳信息,并通过心跳应答将待释放的资源总量和待抢占Container列表返回给它。ApplicationMaster收到该列表后,可选择如下操作:
      • 杀死这些Container
      • 选择并杀死其他Container以凑够总量
      • 不做任何处理,过段时间可能有Container自行释放资源或者由ResourceManager杀死Container
    4. SchedulingEditPolicy探测到一段时间内,ApplicationMaster未自行杀死约定的Container,则将这些Container封装到KILL_CONTAINER事件中发送给ResourceManager
    5. ResourceManager调用ResourceScheduler的killContainer函数,而ResourceScheduler则标注这些待杀死的Container
    6. ResourceManager收到来自NodeManager的心跳信息,并通过心跳应答将待杀死的Container列表返回给它,NodeManager收到该列表后,将这些Container杀死,并通过心跳告知ResourceManager
    7. ResourceManager收到来自ApplicationMaster的心跳信息,并通过心跳应答将已杀死的Container列表发送给它
  6. 在YARN中,队列是按照树形结构组织的,一个队列当前实际可以使用的资源量R取决于最小资源量A(由管理员配置)、队列资源需求量(处于等待或者运行状态的应用程序尚需的资源总量)和同父兄弟队列的空闲资源量C(多余资源可共享给其他队列),这意味着R在不同时间点的取值是不同的,可以按照递归算法求出R=F(A, B, C),这样,如果一个队列当前正在使用资源量U>R,则需从该队列中抢占(U-R)资源
  7. 为了尽可能避免资源浪费,YARN优先选择优先级低的Container作为资源抢占对象,且不会立刻杀死Container,而是将释放资源的任务留给应用程序自己:ResourceManager将待杀死的Container列表发送给对应的ApplicationMaster,以期望它采取一定的机制自行释放这些Container占用的资源,比如先进行一些状态保存工作后,再将对应的Container杀死,以避免计算浪费,如果一段时间后,ApplicationMaster尚未主动杀死这些Container,则ResourceManager再强制杀死这些Container

1.4 层级队列管理机制

  1. 层级队列组织方式具有以下特点:

    • 子队列

      • 队列可以嵌套,每个队列可以包含子队列
      • 用户只能将应用程序提交到最底层的队列,即叶子队列
    • 最少容量
      • 每个子队列均有一个“最少容量比”属性,表示可以使用父队列的容量百分比
      • 调度器总是优先选择当前资源使用率(当时使用的/最少容量)最低的队列,并为之分配资源
      • 最少容量不是“总会保证的最低容量”,也就是说,如果一个队列的最少容量为20,而该队列中所有队列仅使用了5,那么剩下的15可能会分配给其他需要的队列
      • 最少容量的值为不小于0的数,但也不能大于“最大容量”
    • 最大容量
      • 为了防止一个队列超量使用资源,可以为队列设置一个最大容量,这是一个资源使用上限,任何时刻使用的资源总量都不能超过该值
      • 默认情况下队列的最大容量是无限大,这意味着,当一个队列只分配了20%的资源,所有其他队列没有应用程序时,该队列可能使用20%的资源,当其他队列有应用程序提交时,再逐步归还
    • 用户权限管理
      • 管理员可配置每个叶子队列对应的操作系统用户和用户组(Hadoop允许一个操作系统用户或者用户组可对应一个或多个队列),也可以配置每个队列的管理员,他可以杀死该队列中任何应用程序,改变任何应用程序的优先级等(默认情况下用户只能管理自己的应用程序)
    • 系统资源管理
      • YARN资源管理和调度均由调度器完成,管理员可在调度器中设置每个队列的资源容量,每个用户资源量等信息,而调度器则按照这些资源约束对应用程序进行调度
时间: 2024-12-30 11:14:40

YARN资源调度器的相关文章

YARN/MRv2 Resource Manager深入剖析—资源调度器

在YARN中,资源调度器(ResourceScheduler)是一个非常核心的部件,它负责将各个节点上的资源封装成container,并按照一定的约束条件(按队列分配,每个队列有一定的资源分配上限等)分配给各个application. (注意:本文分析基于hadoop-2.0.3-alpha) YARN的资源管理器实际上是一个事件处理器,它需要处理来自外部的6种SchedulerEvent类型的事件,并根据事件的具体含义进行相应的处理.这6种事件含义如下: (1)  NODE_REMOVED 事

Hadoop资源调度器

hadoop调度器的作用是将系统中空闲的资源按一定策略分配给作业.调度器是一个可插拔的模块,用户可以根据自己的实际应用要求设计调度器.Hadoop中常见的调度器有三种,分别为: 1.基于队列的FIFO(先进先出) hadoop默认的资源调度器.优点:简单明了.缺点:忽略了不同作业的需求差异. 2.计算能力调度器Capacity Scheduler 支持多个队列,每个队列可配置一定的资源量,每个队列采用FIFO调度策略,为了防止同一个用户的作业独占队列中的资源,该调度器会对同一用户提交的作业所占资

Hadoop学习之路(8)Yarn资源调度系统详解

文章目录 1.Yarn介绍 2.Yarn架构 2.1 .ResourceManager 2.2 .ApplicationMaster 2.3 .NodeManager 2.4 .Container 2.5 .Resource Request 及 Container 2.6 .JobHistoryServer 2.7.Timeline Server 3.yarn应用运行原理 3.1.yarn应用提交过程 3.2.mapreduce on yarn 4. yarn使用 4.1 .配置文件 4.2.

8、Yarn资源调度系统架构与原理分析

@[TOC] 1.Yarn介绍    Apache Hadoop YARN 是 apache Software Foundation Hadoop的子项目,为分离Hadoop2.0资源管理和计算组件而引入.YARN的诞生缘于存储于HDFS的数据需要更多的交互模式,不单单是MapReduce模式.Hadoop2.0 的YARN 架构提供了更多的处理框架,比如spark框架,不再强迫使用MapReduce框架.   从hadoop2.0 的架构图可以看出,YARN承担着原本由MapReduce承担的

Yarn 调度器Scheduler详解

理想情况下,我们应用对Yarn资源的请求应该立刻得到满足,但现实情况资源往往是有限的,特别是在一个很繁忙的集群,一个应用资源的请求经常需要等待一段时间才能的到相应的资源.在Yarn中,负责给应用分配资源的就是Scheduler.其实调度本身就是一个难题,很难找到一个完美的策略可以解决所有的应用场景.为此,Yarn提供了多种调度器和可配置的策略供我们选择. 一.调度器的选择 在Yarn中有三种调度器可以选择:FIFO Scheduler ,Capacity Scheduler,FairS ched

Yarn调度器负载模拟器——Yarn Scheduler Load Simulator (SLS)

一.概述: Yarn调度器有许多实现,如Fifo, Capacity和Fair schedulers等.与其同时,正在进行一些优化措施来提高调度器在不同负载和工作场景下的性能.每个调度器都有自己的特性,调度决策受许多因素影响,如公平行.计算能力保证和资源的可靠性等.在部署一个调度算法到生产集群之前,评估一个调度算法是非常重要的,不幸的是,评估一个调度算法是不那么容易的,评估一个真正的集群是非常耗费时间和成本的,并且很难找到一个足够大的集群用来评测.所以,一个可以模拟在这种工作场景和负载下调度器的

yarn资源管理器高可用性的实现

资源管理器高可用性 . The ResourceManager (RM) is responsible for tracking the resources in a cluster, and scheduling applications (e.g., MapReduce jobs). Prior to Hadoop 2.4, the ResourceManager is the single point of failure in a YARN cluster. The High Avail

Hadoop Yarn调度器的选择和使用

一.引言 Yarn在Hadoop的生态系统中担任了资源管理和任务调度的角色.在讨论其构造器之前先简单了解一下Yarn的架构.上图是Yarn的基本架构,其中ResourceManager是整个架构的核心组件,它负责整个集群中包括内存.CPU等资源的管理:ApplicationMaster负责应用程序在整个生命周期的任务调度:NodeManager负责本节点上资源的供给和隔离:Container可以抽象的看成是运行任务的一个容器.本文讨论的调度器是在ResourceManager组建中进行调度的,接

Yarn资源调度管理

1.ResourceManager(资源管理器RM)常驻守护进程: 管理集群资源,负责全局资源的监控.分配和管理: 接收来自nodemanager的心跳信息,进行整体资源的汇总: 监控Applicacation Master的开启和创建: 2.Nodemanager(节点管理器NM)常驻守护进程: yarn中的每一台节点服务器都运行一个nodemanager,Nodemanager相当于管理当前机器的一个代理: 负责本台机器的程序运行,并且对本台机器资源进行管理和监控: Nodemanager定