浅谈yarn的调度模式

Hadoop  YARN同时支持内存和CPU两种资源的调度(默认只支持内存,如果想进一步调度CPU,需要自己进行一些配置),本文将介绍YARN是如何对这些资源进行调度和隔离的。yarn对于自己运行时作业的资源分配模式有Capacity Scheduler和Fair Scheduler两种。

在YARN中,资源管理由ResourceManager和NodeManager共同完成,其中,ResourceManager中的调度器负责 资源的分配,而NodeManager则负责资源的供给和隔离。ResourceManager将某个NodeManager上资源分配给任务(这就是所 谓的“资源调度”)后,NodeManager需按照要求为任务提供相应的资源,甚至保证这些资源应具有独占性,为任务运行提供基础的保证,这就是所谓的 资源隔离。

基于以上考虑,YARN允许用户配置每个节点上可用的物理内存资源,注意,这里是“可用的”,因为一个节点上的内存会被若干个服务共享,比如一部分给YARN,一部分给HDFS,一部分给HBase等,YARN配置的只是自己可以使用的,配置参数如下:

(1)yarn.nodemanager.resource.memory-mb

表示该节点上YARN可使用的物理内存总量,默认是8192(MB),注意,如果你的节点内存资源不够8GB,则需要调减小这个值,而YARN不会智能的探测节点的物理内存总量。

(2)yarn.nodemanager.vmem-pmem-ratio

任务每使用1MB物理内存,最多可使用虚拟内存量,默认是2.1。

(3) yarn.nodemanager.pmem-check-enabled

是否启动一个线程检查每个任务正使用的物理内存量,如果任务超出分配值,则直接将其杀掉,默认是true。

(4) yarn.nodemanager.vmem-check-enabled

是否启动一个线程检查每个任务正使用的虚拟内存量,如果任务超出分配值,则直接将其杀掉,默认是true。

(5)yarn.scheduler.minimum-allocation-mb

单个任务可申请的最少物理内存量,默认是1024(MB),如果一个任务申请的物理内存量少于该值,则该对应的值改为这个数。

(6)yarn.scheduler.maximum-allocation-mb

单个任务可申请的最多物理内存量,默认是8192(MB)。

默认情况下,YARN采用了线程监控的方法判断任务是否超量使用内存,一旦发现超量,则直接将其杀死。由于Cgroups对内存的控制缺乏灵活性 (即任务任何时刻不能超过内存上限,如果超过,则直接将其杀死或者报OOM),而Java进程在创建瞬间内存将翻倍,之后骤降到正常值,这种情况下,采用 线程监控的方式更加灵活(当发现进程树内存瞬间翻倍超过设定值时,可认为是正常现象,不会将任务杀死),因此YARN未提供Cgroups内存隔离机制。

Capacity Scheduler

Capacity Scheduler支持以下特性:

(1) 计算能力保证。支持多个队列,某个作业可被提交到某一个队列中。每个队列会配置一定比例的计算资源,且所有提交到队列中的作业共享该队列中的资源。

(2) 灵活性。空闲资源会被分配给那些未达到资源使用上限的队列,当某个未达到资源的队列需要资源时,一旦出现空闲资源资源,便会分配给他们。

(3) 支持优先级。队列支持作业优先级调度(默认是FIFO)

(4) 多重租赁。综合考虑多种约束防止单个作业、用户或者队列独占队列或者集群中的资源。

(5) 基于资源的调度。 支持资源密集型作业,允许作业使用的资源量高于默认值,进而可容纳不同资源需求的作业。不过,当前仅支持内存资源的调度。


想要配置能力调度模式首先我们需要将yarn-site.xml文件中设置yarn.resourcemanager.scheduler.class属性为org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.CapacityScheduler

1.  资源分配相关参数

(1)  capacity:队列的资源容量(百分比)。 当系统非常繁忙时,应保证每个队列的容量得到满足,而如果每个队列应用程序较少,可将剩余资源共享给其他队列。注意,所有队列的容量之和应小于100。

(2)  maximum-capacity:队列的资源使用上限(百分比)。由于存在资源共享,因此一个队列使用的资源量可能超过其容量,而最多使用资源量可通过该参数限制。

minimum-user-limit-percent:每个用户最低资源保障(百分比)。任何时刻,一个队列中每个用户可使用的资源量均有一定的限制。当一个队列中同时运行多个用户的应用程序时中,每个用户的使用资源量在一个最小值和最大值之间浮动,其中,最小值取决于正在运行的应用程序数目,而最大值则由minimum-user-limit-percent决定。比如,假设minimum-user-limit-percent为25。当两个用户向该队列提交应用程序时,每个用户可使用资源量不能超过50%,如果三个用户提交应用程序,则每个用户可使用资源量不能超多33%,如果四个或者更多用户提交应用程序,则每个用户可用资源量不能超过25%。

(3)  user-limit-factor:每个用户最多可使用的资源量(百分比)。比如,假设该值为30,则任何时刻,每个用户使用的资源量不能超过该队列容量的30%。

2.  限制应用程序数目相关参数

(1)  maximum-applications :集群或者队列中同时处于等待和运行状态的应用程序数目上限,这是一个强限制,一旦集群中应用程序数目超过该上限,后续提交的应用程序将被拒绝,默认值为 10000。所有队列的数目上限可通过参数yarn.scheduler.capacity.maximum-applications设置(可看做默认 值),而单个队列可通过参数yarn.scheduler.capacity.<queue-path>.maximum- applications设置适合自己的值。

(2)  maximum-am-resource-percent:集群中用于运行应用程序 ApplicationMaster的资源比例上限,该参数通常用于限制处于活动状态的应用程序数目。该参数类型为浮点型,默认是0.1,表示10%。所 有队列的ApplicationMaster资源比例上限可通过参数yarn.scheduler.capacity. maximum-am-resource-percent设置(可看做默认值),而单个队列可通过参数 yarn.scheduler.capacity.<queue-path>. maximum-am-resource-percent设置适合自己的值。

3.  队列访问和权限控制参数

(1)  state 队列状态可以为STOPPED或者 RUNNING,如果一个队列处于STOPPED状态,用户不可以将应用程序提交到该队列或者它的子队列中,类似的,如果ROOT队列处于STOPPED 状态,用户不可以向集群中提交应用程序,但正在运行的应用程序仍可以正常运行结束,以便队列可以优雅地退出。

(2)  acl_submit_applications:限定哪些Linux用户/用户组可向给定队列中提交应用程序。需要注意的是,该属性具有继承性,即如果一个用户可以向某个队列中提交应用程序,则它可以向它的所有子队列中提交应用程序。配置该属性时,用户之间或用户组之间用“,”分割,用户和用户组之间用空格分割,比如“user1, user2 group1,group2”。

(3)  acl_administer_queue:为队列指定一个管理员,该管理员可控制该队列的所有应用程序,比如杀死任意一个应用程序等。同样,该属性具有继承性,如果一个用户可以向某个队列中提交应用程序,则它可以向它的所有子队列中提交应用程序。


Fair Scheduler

公平调度器按资源池(pool)来组织作业,并把资源公平的分到这些资源池里。默认情况下,每一个用户拥有一个独立的资源池,以使每个用户都能获得 一份等同的集群资源而不管他们提交了多少作业。按用户的 Unix 群组或作业配置(jobconf)属性来设置作业的资源池也是可以的。在每一个资源池内,会使用公平共享(fair sharing)的方法在运行作业之间共享容量(capacity)。用户也可以给予资源池相应的权重,以不按比例的方式共享集群。

除了提供公平共享方法外,公平调度器允许赋给资源池保证(guaranteed)最小共享资源,这个用在确保特定用户、群组或生产应用程序总能获取 到足够的资源时是很有用的。当一个资源池包含作业时,它至少能获取到它的最小共享资源,但是当资源池不完全需要它所拥有的保证共享资源时,额外的部分会在 其它资源池间进行切分。

要想配置公平调度模式首先我们需要将yarn-site.xml文件中设置yarn.resourcemanager.scheduler.class属性为org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler

Fair Scheduler允许用户将队列信息专门放到一个配置文件(默认是fair-scheduler.xml),对于每个队列,管理员可配置以下几个选项:

(1)  minResources :最少资源保证量,设置格式为“X mb, Y vcores”,当一个队列的最少资源保证量未满足时,它将优先于其他同级队列获得资源,对于不同的调度策略(后面会详细介绍),最少资源保证量的含义不 同,对于fair策略,则只考虑内存资源,即如果一个队列使用的内存资源超过了它的最少资源量,则认为它已得到了满足;对于drf策略,则考虑主资源使用 的资源量,即如果一个队列的主资源量超过它的最少资源量,则认为它已得到了满足。

(2)  maxResources最多可以使用的资源量,fair scheduler会保证每个队列使用的资源量不会超过该队列的最多可使用资源量。

(3)  maxRunningApps最多同时运行的应用程序数目。通过限制该数目,可防止超量Map Task同时运行时产生的中间输出结果撑爆磁盘。

(4)  minSharePreemptionTimeout最小共享量抢占时间。如果一个资源池在该时间内使用的资源量一直低于最小资源量,则开始抢占资源。

(5)  schedulingMode/schedulingPolicy:队列采用的调度模式,可以是fifo、fair或者drf。

(6)  aclSubmitApps可向队列中提交应用程序的Linux用户或用户组列表,默认情况下为“*”,表示任何用户均可以向该队列提交应用程序。需要注意的是,该属性具有继承性,即子队列的列表会继承父队列的列表。配置该属性时,用户之间或用户组之间用“,”分割,用户和用户组之间用空格分割,比如“user1, user2 group1,group2”。

(7)  aclAdministerApps:该队列的管理员列表。一个队列的管理员可管理该队列中的资源和应用程序,比如可杀死任意应用程序。

管理员也可为单个用户添加maxRunningJobs属性限制其最多同时运行的应用程序数目。此外,管理员也可通过以下参数设置以上属性的默认值:

(1)  userMaxJobsDefault:用户的maxRunningJobs属性的默认值。

(2) defaultMinSharePreemptionTimeout :队列的minSharePreemptionTimeout属性的默认值。

(3)  defaultPoolSchedulingMode:队列的schedulingMode属性的默认值。

(4)  fairSharePreemptionTimeout:公平共享量抢占时间。如果一个资源池在该时间内使用资源量一直低于公平共享量的一半,则开始抢占资源。


时间: 2024-11-08 22:33:08

浅谈yarn的调度模式的相关文章

浅谈设计模式1-策略模式

对于大多数面向对象的初学者来说,将思维模式从面向过程转变过来是一个比较困难的过程.很多人在用面向对象语言编写程序的时候,依然会感觉自己在用面向过程的思维,笔者分享这篇文章的用意便是希望可以对大家有一些积极的影响. 阅读本文可以是没有接触设计模式,但需要一定的面向对象基础,至少简单理解封装,继承多态. 对于刚开始接触设计模式来说,一开始就说概念性的东西,很少能够理解.所以我们可以先跳过这些,通过一个小的程序场景来进行一个比较直观的认识. 模拟魂斗罗发射子&弹 相信大家小的时候玩过一款叫魂斗罗的游戏

浅谈设计模式:原型模式(Prototype Pattern)

热爱生活.享受娱乐.专注技术,欢迎关注QGer,我们一起见证成长! 什么是原型模式? 官方解释: cloning of an existing object instead of creating new one and can also be customized as per the requirement.(克隆一个现有对象来代替新建一个对象,并且可以按定制要求克隆) 通俗解释:通过新建一个原型对象(该对象实现一个具有克隆接口的抽象类.接口)指明要创建的类型,调用对象自身的克隆接口创建出更

菜鸟之路-浅谈设计模式之工厂模式

工厂模式 工厂模式是我们最经常使用的实例化对象模式了,是用工厂方法取代new操作的一种模式. 著名的Jive论坛 ,就大量使用了工厂模式,工厂模式在Java程序系统能够说是随处可见. 由于工厂模式就相当于创建实例对象的new.我们经常要依据类Class生成实例对象,如A a=new A() 工厂模式也是用来创建实例对象的,所以以后new时就要多个心眼,能否够考虑使用工厂模式,尽管这样做,可能多做一些工作,但会给你系统带来更大的可扩展性和尽量少的改动量. 工厂模式定义 我们以类Sample为例,

浅谈设计模式之七——Composite模式

同样地,先上uml图: 组合模式的意图:将对象组合合成树形结构以表示"部分-整体"的层次结构.Composite使得用户对单个对象和组合对象的使用具有一致性. uml解析:leaf是叶节点,Composite可以理解为是一个多个叶节点的组合,它是非叶节点,就相当于一个元件以及一个元件容器,里面有很多元件一样.这里可以用list或者vector实现. 本来是想用模板来实现,后来发现实在是多此一举,而且反而更不好了. 这里需要说的一点就是Leaf是叶节点,因此肯定没有添加.删除等功能,因为

浅谈设计模式:迭代器模式(Iterator Pattern)

热爱生活.享受娱乐.专注技术,欢迎关注QGer,我们一起见证成长! 什么是迭代器模式? 官方解释:to access the elements of an aggregate object sequentially without exposing its underlying implementation. 顺序地访问集合对象的元素并且不暴露它的内部实现 通俗解释:假设给定一个集合对象,定义一个与之相关联的Iterator(迭代器),该迭代器能够访问集合对象的内部元素,通过迭代的方法能够按照顺

浅谈C#中的模式窗体和非模式窗体

ShowDialog();// 模式窗体 Show(); // 非模式窗体差别:1.返回值不同,DialogResult/void2.模式窗体会使程序中断,直到关闭模式窗口3.打开模式窗体后不能切换到应用程序的其他窗体4.子窗体和模式窗体互斥.

浅谈设计模式:解释器模式(Interpreter Pattern)

热爱生活.享受娱乐.专注技术,欢迎关注微信公众号QGer,我们一起见证成长! 什么是解释器模式? 官方解释:to define a representation of grammar of a given language, along with an interpreter that uses this representation to interpret sentences in the language. 定义一个给定语言的语法表达式,并用该表达式作为一个解释器来解释语言中的句子. 通俗

浅谈HTML文档模式

不知道爱多想的你有没有在编写HTML代码时思考过 <!DOCTYPE html> 或是这一长串看都看不懂的 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> 的代码,它是做什么的,为什么要有这句话,这句话起什么作用,它和其他HTML代码有关吗?嘤嘤嘤我才不回告诉你在前端的面试题中会经常看到对这个知识点的提问,而我

浅谈设计模式之八——Decorator模式

先上uml图: 意图:动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator模式相比生成子类更为灵活. uml解析:装饰者模式又名包装器,顾名思义就是给某个对象添加一些功能,而不是给整个类添加一些功能.Component跟Decorator是聚合关系,子类ConcreteDecoratorA和ConcreteDecoratorB实现具体对Component的修饰. 下面给出可执行的示例代码: Decorator.h #pragma once #include <iostream>