一种基于YARN的高优先级作业调度实现方案

2016-05-16 02:09詹文涛艾中良刘忠麟李常宝高泽
软件 2016年3期

詹文涛+艾中良+刘忠麟+李常宝+高泽

摘要:提交到YARN上的一个大数据作业会被切分为一个或者多个任务,任务是大数据作业申请资源和执行的基本单位。在某些领域中存在需要对作业紧急度作有效区分使得高紧急度作业优先获得资源的需求,但是在现有的YARN资源调度策略中,对于提交到YARN上的高优先级作业缺乏资源优先分配和高质量的资源保障机制。本文在修改YARN原有资源调度方案的基础上,提出了一种基于YARN的高优先级作业调度实现方案。实验表明,提交到YARN上的高优先级作业执行效率提升了7%左右,证明设计方案行之有效。

关键词:YARN;作业调度;高优先级

中图分类号:TP391 文献标识码:A DOI:10.3969/j.issn.1003-6970.2016.03.021

0引言

YARN分布式大数据资源调度框架用于给运行于其上的作业调度资源并管理作业执行流程。现有的作业调度方案是以将作业分配给有空闲资源的节点为唯一目标的。在某些领域中存在需要对作业紧急度作有效区分使得高紧急度作业优先获得调度资源的需求,在实际调研和使用中发现已有的YARN资源调度方案并不能很好的满足这一需求。本文提出了一种YARN上的高优先级作业调度方案,通过将作业提交到自定义的高优先级队列上,在资源调度过程中优先为高优先级作业分配资源,并避免当高优先级作业运行时,低优先级作业对其形成的资源竞争,实现了在集群负载较高情况下高优先级作业的执行效率提升。

1现有的YARN作业调度方案

对于YARN资源调度平台而言,按照现在的调度方案,当有一个紧急度比较高的任务提交到处理平台时,会提交到相应的调度队列上,由中心调度器处理。中心调度器选中将要为其分配任务的目标节点、遍历调度队列的层级队列树选择队列,给选中队列分配节点上的资源。对于队列上待分配资源的作业集合,首先按照作业提交先进先出的顺序分配节点上的资源,在同一个作业的多个任务中,为了控制任务执行顺序,给资源请求一个优先级属性,使得优先级高的任务能够优先获得资源。

这种作业调度方案对于作业整体而言缺乏一个作业层面的整体保障,使得不同作业之间调度紧急性缺乏一个有效的区分,同时有高紧急度作业提交到YARN上,无法避免当节点上运行有高优先级任务时普通任务对高优先级作业形成的资源竞争。

因此,需求为:保障当集群中提交有高优先级作业时,高优先作业优先获得集群资源,使其能够更快的获得资源分配;保障当一个普通作业提交到目标节点上时,如果目标节点运行有高优先级任务,限制低优先级任务分配可用资源量,以使得高优先级任务能够更好的运行。

2高优先级作业调度设计与实现

2.1实现思路

高优先级作业优先调度的设计方案是基于Capacity资源调度器实现的,本课题的开展按照以下步骤进行:

高优先级作业描述和解析。中心调度器是一个可插拔组件,可采用定义配置文件的方式给调度器配置相关参数。本课题设计为,给队列一个优先级属性,使得提交到该队列上的作业优先调度分配资源。并且给队列一个资源阈值属性,使得提交到该队列的任务能够参考该阈值属性,确定是否需要限制节点可分配资源量。并修改Web界面中对任务队列描述部分参数。

在对高优先级队列进行描述的基础上,设计高优先级作业资源分配流程。流程如下:

选择任务调度的目标节点。中心调度器保存了集群上所有节点及其资源量信息,该过程为选中节点集合中待为该节点分配作业的目标节点。

给高优先级队列上任务优先分配资源。在选择好目标节点后,本步骤为在高优先级队列已经定义过,并且作业提交到高优先级队列上时,设计先为高优先级队列上的作业分配节点上资源后为普通队列上的任务分配资源。

节点上运行有高优先级任务时,给普通任务添加阈值限制。一个节点上会同时运行不同作业的任务,当节点上有高优先级任务时,保障优先级任务的资源质量。

2.2实现方案

本课题设计的YARN高优先级作业调度模块图如图l所示:

其中阴影部分模块为添加或者修改过的模块,功能如下。

调度器配置:是管理员用户使用调度处理器的对外接口,用以配置调度器中集群上资源的组织方式,包括层级队列的结构,队列可使用资源量,用户提交权限等信息。

Web界面:Hadoop YARN提供了一个可视化的web界面,用以实时监测队列中资源使用信息,队列资源相关的参数。

资源层级队列:其中队列分为父队列和叶子队列两种,队列基本信息包括从配置文件中解析到的信息和任务提交时作业集合信息,以及NodeManager注册和心跳过程中更新的集群中资源量信息等。

作业调度处理器:作业调度器同时也是一个作业调度处理器,不同的调度事件类型触发不同的行为,包括NODE_ADDED,NODE_REMOVED,NODE RESOURCE_UPDATE,NODE_UPDATE,APP_ADDED等。NODE_UPDATE事件触发资源调度分配过程,是高优先作业调度的执行入口。

作业分配:对于调度处理器中已经分配好的作业,放在一个数据结构中,由AppplciationMaster主动拉取。

高优先级作业调度策略的实现按照如下步骤进行。

高优先级作业描述和解析。

1.队列描述共涉及到如下类或者接口:

CSQueue接口是队列通用方法描述接口,添加getPSThreshold、isPrior方法。AbstractCSQueue抽象类,定义叶子节点和非叶子队列共有的方法。

LeafOueue继承了AbstractCSQueue类,添加psthreshold、isPrior属性。实现CSQueue接口中方法。

ParentQueue继承了AbstractCSQueue类,实现CSQueue接口中方法。

2.队列解析,共涉及到如下类或接口。CapacityScheduler类,将配置文件中队列描述映射为配置文件对象。共涉及到如下方法:initializeQueues,初始化配置文件中定义的队列,转换为iava对象;initializeQueueMappings,检验队列的合法性;parseQueue,递归解析队列并判断某一个队列是否为高优先级队列,并修改高优先级队列可用容量为集群总容量,保存在CapacityScheduler属性里。队列解析流程如下:

(1)选择任务调度的目标节点。中心调度器选择目标节点有两种方案,第一种方案与心跳协议相关,发送心跳消息的节点为目标节点;第二种方案按照节点列表的顺序选择目标节点。因此第二种方案存在选择目标节点的流程,CapacityScheduler类中schedule方法实现了选择目标节点逻辑。

YARN web界面中相应的修改,主要涉及到如下类和方法:CapacitySchedulerPage类中render方法。CapacitySchedulerLeafOueuelnfo类中添加getPSTheshold、isPrior方法,这部分类图调用关系如下:

(2)给高优先队列上任务优先分配资源。涉及到CapacitySchedule类中priorAllocateContainersTo-Node函数,其代码流程图如下:

(3)节点运行有高优先级任务时,给普通任务添加阈值限制。主要涉及到CapacitySchedule类中allocateContainersToNode方法,为第三步中流程的一个子流程,细分如下:

以上是高优先级作业调度的实现方案的整个过程。这种设计方案的好处是,保持YARN对外接口一致性,兼容了YARN本身的资源调度策略,在此基础上添加相关配置参数即可使用。

3实验验证与性能分析

本课题实验环境搭建如下,共有4台服务器,一台普通计算节点。可用资源配置如下:

搭建hadoop集群环境,修改capacity-sched-uler.xml队列描述,给集群配置三个子队列,分别为:

实验测试实例一为wordcount,数据集为8.3G;实例二为pi 100 100。以下为功能验证和性能验证。

3.1功能验证

高优先级作业优先调度部分验证功能点如下:(1)对高优先级作业的描述和解析,即对队列属性描述的实现;(2)在集群负载比较满的情况下,高优先级作业优先获得资源并调度运行。因此实验验证也分两部分进行,其中(1)可从启动时HadoopYARN界面中队列相关的属性展示验证,(2)需要进一步设计相关的实验。

启动YARN后,访问Hadoop YARN界面,查看队列定义部分功能,界面显示如下:

图中参数描述显示root队列下共有两个子队列default与prod。配置default为普通队列,资源阈值为0.8;prod为优先级队列,资源阈值为1,可用资源量为100%,即集群资源量。功能要点(1)验证成功。

功能要点(2)实验设计思路如下:利用集群单节点资源量有限,提交较大任务,造成节点资源占满的情况,再向高优先级队列中提交任务,记录相关数据。详细设计为:在同一个节点,先向default普通队列上提交一个任务,在任务运行过程中向prod优先级队列提交另一个相同任务。实验过程如下:

分别提交作业1、2、3.作业执行情况数据汇总如下:

记录作业1更加详细的执行情况:

分析以上实验数据,得出如下结论:

1.由表3可知:作业提交时间为1<2<3,作业执行完成时间为2<3<1,其中1为普通队列上的作业,2、3为优先级队列上的作业。即在集群负载满情况下,任务队列中同时有高低优先级作业时,高优先级作业优先调度完成。

2.对照表3和4可知:在执行普通作业的过程中提交高优先级作业,此时普通作业暂停执行,直到高优先级作业执行完毕后,普通作业重新开始调度执行。这是因为在集群负载较满情况下,高优先级作业优先分配资源。

综上说明了提交到高优先级队列上的作业优先调度执行,功能点(2)验证成功。

3.2性能分析

本课题的性能分析设计为:在集群闲置情况下测试实例执行时间,实例一执行时间为10分钟左右,实例二执行时间为3分钟左右。设计分两个过程进行:

过程1:先向default队列提交1个作业,再向food队列提交1个作业,使集群资源负载占满,作业选择实例1,在任务执行过程中再向prod队列提交3个作业,记录prod队列上作业从提交到运行结束时间,作业选择实例2。

过程2:先向defaulf队列提交1个作业,在任务执行过程中再向food队列提交1个作业,使集群负载占满,作业选择实例1,在任务执行过程中再向food队列提交3个作业,记录food队列上后提交三个任务从提交到运行结束时间,作业选择实例2。

重复三次,取均值。实验记录为:

由表5可知:在运行有较大任务将集群资源占满的情况下,提交高优先级作业,高优先级作业能立即开始执行。

综上所述,本课题中设计的资源调度方案,成功实现了高优先级作业优先调度,并提升了在集群负载较满的情况下高紧急度作业执行效率,效率提升为(359.7-336.7)/336.7≈7%。

4结论

本文实现了一种基于YARN的高优先级作业调度方案,解决了在某些领域中需要区分作业紧急度,实现高紧急度作业优先调度资源并保障资源质量的问题,实验证明该方案提升了高紧急度作业的执行效率。