YARN开源增强特性
任务优先级调度
在原生的YARN资源调度机制中,如果先提交的MapReduce Job长时间地占据整个Hadoop集群的资源,会使得后提交的Job一直处于等待状态,直到Running中的Job执行完并释放资源。
MRS集群提供了任务优先级调度机制。此机制允许用户定义不同优先级的Job,后启动的高优先级Job能够获取运行中的低优先级Job释放的资源;低优先级Job未启动的计算容器被挂起,直到高优先级Job完成并释放资源后,才被继续启动。
该特性使得业务能够更加灵活地控制自己的计算任务,从而达到更佳的集群资源利用率。
容器可重用与任务优先级调度有冲突,若启用容器重用,资源会被持续占用,优先级调度将不起作用。
YARN的权限控制
Hadoop YARN的权限机制是通过访问控制列表(ACL)实现的。按照不同用户授予不同权限控制,主要介绍下面两个部分:
- 集群运维管理员控制列表(Admin Acl)
该功能主要用于指定YARN集群的运维管理员,其中,MRS集群管理员列表由参数“yarn.admin.acl”指定。集群运维管理员可以访问ResourceManager WebUI,还能操作NodeManager节点、队列、NodeLabel等,但不能提交任务。
- 队列访问控制列表(Queue Acl)
为了方便管理集群中的用户,YARN将用户/用户组分成若干队列,并指定每个用户/用户组所属的队列。每个队列包含两种权限:提交应用程序权限和管理应用程序权限(比如终止任意应用程序)。
开源功能:
虽然目前YARN服务的用户层面上支持如下三种角色:
- 集群运维管理员
- 队列管理员
- 普通用户
但是当前开源YARN提供的WebUI/RestAPI/JavaAPI等接口上不会根据用户角色进行权限控制,任何用户都有权限访问应用和集群的信息,无法满足多租户场景下的隔离要求。
增强:
安全模式下,对开源YARN提供的WebUI/RestAPI/JavaAPI等接口上进行了权限管理上的增强,支持根据不同的用户角色,进行相应的权限控制。
各个角色对应的权限如下:
- 集群运维管理员:拥有在YARN集群上执行管理操作(如访问ResourceManager WebUI、刷新队列、设置NodeLabel、主备倒换等)的权限。
- 队列管理员:拥有在YARN集群上所管理队列的修改和查看权限。
- 普通用户:拥有在YARN集群上对自己提交应用的修改和查看权限。
自研超级调度器Superior Scheduler原理
Superior Scheduler是一个专门为Hadoop YARN分布式资源管理系统设计的调度引擎,是针对企业客户融合资源池,多租户的业务诉求而设计的高性能企业级调度器。
Superior Scheduler可实现开源调度器、Fair Scheduler以及Capacity Scheduler的所有功能。另外,相较于开源调度器,Superior Scheduler在企业级多租户调度策略、租户内多用户资源隔离和共享、调度性能、系统资源利用率和支持大集群扩展性方面都做了针对性的增强。设计的目标是让Superior Scheduler直接替代开源调度器。
类似于开源Fair Scheduler和Capacity Scheduler,Superior Scheduler通过YARN调度器插件接口与YARN Resource Manager组件进行交互,以提供资源调度功能。图1为其整体系统图。
图1中,Superior Scheduler的主要模块如下:
- Superior Scheduler Engine:具有丰富调度策略的高性能调度器引擎。
- Superior YARN Scheduler Plugin:YARN Resource Manager和Superior Scheduler Engine之间的桥梁,负责同YARN Resource Manager交互。
在调度原理上,开源的调度器都是基于计算节点心跳驱动的资源反向匹配作业的调度机制。具体来讲,每个计算节点定期发送心跳到YARN的Resource Manager通知该节点状态并同时启动调度器为这个节点分配作业。这种调度机制把调度的周期同心跳结合在一起,当集群规模增大时,会遇到系统扩展性以及调度性能瓶颈。另外,因为采用了资源反向匹配作业的调度机制,开源调度器在调度精度上也有局限性,例如数据亲和性偏于随机,另外系统也无法支持基于负载的调度策略等。主要原因是调度器在选择作业时,缺乏全局的资源视图,很难做到最优选择。
Superior Scheduler内部采用了不同的调度机制。Superior Scheduler的调度器引入了专门的调度线程,把调度同心跳剥离开,避免了系统心跳风暴问题。另外,Superior Scheduler调度流程采用了从作业到资源的正向匹配方法,这样每个调度的作业都有全局的资源视图,可以很大的提到调度的精度。相比开源调度器,Superior Scheduler在系统吞吐量、利用率、数据亲和性等方面都有很大提升。
Superior Scheduler除了提高系统吞吐量和利用率,还提供了以下主要调度功能:
- 多资源池
多资源池有助于在逻辑上划分集群资源并在多个租户/队列之间共享它们。资源池的划分可以基于异构的资源或完全按照应用资源隔离的诉求来划分。对于一个资源池,不同队列可配置进一步的策略。
- 每个资源池多租户调度(reserve、min、share、max)
Superior Scheduler提供了灵活的层级多租户调度策略。并允许针对不同的资源池可以访问的租户/队列,配置不同策略,如下所示。
表1 策略描述 策略名称
描述
reserve
预留租户资源。即使租户没有作业,其他租户也不能使用该预留的资源。其值可以是百分比或绝对值。如果两者都配置,调度系统动态计算转换为资源绝对值,并取两者的最大值。缺省的reserve值为0。相对于定义一个专用资源池并指定具体机器的方式,reserve的策略可以认为提供了一种灵活的浮动预留功能,由于并不限定具体的机器,可以提高计算的数据亲和性,也不会受具体机器故障的影响。
min
具有抢占支持的最低保证资源。其他租户可以使用这部分资源,但是本租户享有优先使用权。其值可以是百分比或绝对值。如果两者都配置,调度系统动态计算转换为资源绝对值,并取两者的最大值。缺省值是0。
share
不支持抢占的共享资源。本租户要使用这部分资源时,需要等待其他租户完成作业并释放资源。其值是百分比或绝对值。
max
允许的最大资源数量。租户无法获得比允许的最大资源多的资源。其值是百分比或绝对值。如果两者都配置,调度系统动态计算转换为资源绝对值,并取两者最大值。缺省值不受限制。
租户资源分配策略示意图,如图3所示。
其中“total”表示总资源,不是调度策略。
同开源的调度器相比,Superior Scheduler同时提供了租户级百分比和绝对值的混配策略,可以很好的适应各种灵活的企业级租户资源调度诉求。例如,用户可以在一级租户提供最大绝对值的资源保障,这样租户的资源不会因为集群的规模改变而受影响。但在下层的子租户之间,可以提供百分比的分配策略,这样可以尽可能提升一级租户内的资源利用率。
- 异构和多维资源调度
Superior Scheduler支持CPU和内存资源的调度外,还支持扩展支持以下功能:
- 节点标签可用于识别像GPU_ENABLED,SSD_ENBALED等节点的多维属性,可以根据这些标签进行调度。
- 资源池可用于对同一类别的资源进行分组并分配给特定的租户/队列。
- 租户内多用户公平调度
在叶子租户里,多个用户可以使用相同的队列来提交作业。相比开源调度器,Superior Scheduler可以支持在同一租户内灵活配置不同用户的资源共享策略。例如可以为VIP用户配置更多的资源访问权重。
- 数据位置感知调度
Superior Scheduler采用“从作业到节点的调度策略”,即尝试在可用节点之间调度给定的作业,使得所选节点适合于给定作业。通过这样做,调度器将具有集群和数据的整体视图。如果有机会使任务更接近数据,则保证了本地化。而开源调度器采用“从节点到作业的调度策略”,在给定节点中尝试匹配适当的作业。
- Container调度时动态资源预留
在异构和多样化的计算环境中,一些container需要更多的资源或多种资源,例如Spark作业可能需要更大的内存。当这些container与其他需要较小资源的container竞争时,可能没有机会在合理的时间内获得所需的资源而处于饥饿状态。由于开源的调度器是基于资源反向匹配作业的调度方式,会为这些作业盲目的进行资源预留以防进入饥饿状态。这就导致了系统资源的整体浪费。Superior Scheduler与开源特性的不同之处在于:
- 基于需求的匹配:由于Superior Scheduler采用“从作业到节点的调度”,能够选择合适的节点来预留资源提升这些特殊container的启动时间,并避免浪费。
- 租户重新平衡:启用预留逻辑时,开源调度器并不遵循配置的共享策略。Superior Scheduler采取不同的方法。在每个调度周期中,Superior Scheduler将遍历租户,并尝试基于多租户策略重新达到平衡,且尝试满足所有策略(reserve,min,share等),以便可以释放预留的资源,将可用资源流向不同租户下的其他本应得到资源的container。
- 动态队列状态控制(Open/Closed/Active/Inactive)
支持多个队列状态,有助于MRS集群管理员操作和维护多个租户。
- Open状态(Open/Closed):如果是Open(默认)状态,将接受提交到此队列的应用程序,如果是Closed状态,则不接受任何应用程序。
- Active状态(Active/Inactive):如果处于Active(默认)状态,租户内的应用程序是可以被调度和分配资源。如果处于Inactive状态则不会进行调度。
- 应用等待原因
Superior Scheduler和YARN开源调度器作了对比分析,如表2所示:
领域 |
YARN开源调度器 |
Superior Scheduler |
---|---|---|
多租户调度 |
在同构集群上,只能选择容量调度器(Capacity Scheduler)或公平调度器(Fair Scheduler)两者之一,且集群当前不支持公平调度器(Fair Scheduler)。容量调度器只支持百分比方式配置,而公平调度器只支持绝对值方式。 |
|
数据位置感知调度 |
从节点到作业的调度策略导致降低数据本地话命中率,潜在影响应用的执行性能。 |
从作业到节点的调度策略。可具有更精确的数据位置感知,数据本地化调度的作业命中率比较高。 |
基于机器负载的均衡调度 |
不支持 |
Superior Scheduler在调度时考虑机器的负载和资源分配情况,做到均衡调度。 |
租户内多用户公平调度 |
不支持 |
租户内用户的公平调度,支持关键字default、others。 |
作业等待原因 |
不支持 |
作业等待原因信息可显示为什么作业需等待。 |
综上所述,Superior Scheduler是一个高性能调度器,拥有丰富的调度策略,在功能、性能、资源利用率和扩展性方面都优于Capacity Scheduler。
支持CPU硬隔离
YARN无法严格控制每个container使用的CPU资源。在使用CPU子系统时,container可能会超额占用资源。所以,我们使用CPUset控制资源分配。
为了解决这个问题,CPU将会被严格按照虚拟核和物理核的比例分配至各个container。如果container需要一整个物理核,则分配给它一整个物理核。若container只需要部分物理核,则可能发生几个container共享同一个物理核的情况。下图为CPU配额示例,假定虚拟核和物理核的比例为2:1。
YARN开源增强特性:重启性能优化
一般情况下,RM恢复会获取正在运行和已完成的应用。而大量的已完成的应用可能导致RM启动过慢、HA切换/重启耗时过长等问题。
为了加速RM的启动,现在优先获取未完成的应用列表,再启动RM。此时,已完成的应用会在一个后台异步线程中继续恢复。下图展示了RM的启动恢复流程。