一种适于大规模并行数据处理任务的两级自适应调度方法与流程

文档序号:16134128发布日期:2018-12-01 00:42阅读:321来源:国知局

本发明涉及一种适于大规模并行数据处理任务的两级自适应调度方法,属于数据处理任务调度领域。

背景技术

随着互联网技术不断发展,各领域对大规模海量数据存储和处理的需求不断增加,对其工作效率和处理成本的要求也日益提高。如何把大规模数据处理任务合理分配到多处理器系统,提高执行效率,追求最小的整体执行时间,已成为当前亟需解决的难题。

传统的通用任务调度算法,如先来先服务调度算法、高优先级优先调度算法、时间片轮询调度算法等,都存在着一定的局限性,不适用于大规模数据处理任务调度。比如,先来先服务调度算法,虽然实现简单,但会导致后到来的实时性要求高的任务不能被及时调度;高优先级优先调度算法,保障了紧急任务的优先执行,但同时会导致低优先级任务等待时间过长;时间片轮询调度算法,通过切换任务上下文,使任务公平地被调度,但随着任务规模增大,频繁切换任务上下文,系统开销将增加,会影响整体调度性能。同时,这些通用的任务调度算法,没能充分考虑数据处理任务的业务特殊性,以及不同任务所处理数据之间的强依赖关系,从而导致针对性不足,无法满足大规模并行数据处理任务的时效性要求。

借鉴传统调度算法,国内外对此展开了大量的研究。中国专利公开号cn107196874a,公开日2017年9月22日,发明创造名称为一种队列调度算法及系统,该申请案公开了一种高效并具有延时性能的队列调度算法,通过引入虚拟延迟为高优先级任务提供时延保证,通过权值调整机制使得突发任务得到及时调度。该方法未将长任务和短任务执行分开,执行时间长的任务被调度后会长期占用系统资源,导致执行时间短且优先级较高的任务因需排队等待而得不到及时执行,增加了整体等待时间,降低了系统响应能力。



技术实现要素:

本发明的技术解决问题是:克服现有技术的不足,提供一种适于大规模并行数据处理任务的两级自适应调度方法,基于任务/子任务两个层级对任务进行处理,提高并行度,有效解决了任务间复杂依赖关系所带来的并行调度困难问题,实现了大规模数据处理任务有序、高效的并行处理,降低了整体执行时间。

本发明的技术解决方案是:一种适于大规模并行数据处理任务的两级自适应调度方法,包括如下步骤:

步骤一,在任务层级,执行如下工作:

(1.1)将上层应用提交的任务按任务类型放置于相应的任务等待队列中,所述任务等待队列包括长任务等待队列、短任务等待队列和即时任务等待队列;

(1.2)调度器按任务间依赖关系和当前空闲的执行器个数,从任务等待队列中取出当前能够执行的任务,分发给相应的执行器池,所述执行器池包括长任务执行器池、短任务执行器池和即时任务执行器池;

(1.3)每种类型的执行器池将接收的任务分发给当前空闲的执行器;

步骤二,进入子任务层级,执行如下工作:

(2.1)执行器将接收的任务拆分为子任务,并将子任务有序地分配给多线程并行处理;

(2.2)任务执行完成后,将任务状态标记为执行完成,并将其放入已完成任务数据库中。

上层应用在提交任务的同时,还需附带上任务的相关属性,包括任务名称、任务类型、业务类型、前驱任务列表、任务上下文和子任务二级链表;

其中,任务类型包括长任务、短任务和即时任务三类,其中长任务是指上层应用预估任务所需执行时间大于执行时间划分阈值的任务,短任务是指上层应用预估任务所需执行时间小于执行时间划分阈值的任务;

业务类型是指任务的业务功能;

前驱任务列表中列出的是当前任务所直接依赖的全部前驱任务,只有在前驱任务执行完毕后当前任务才可以执行;

子任务二级链表记录子任务执行顺序的二维拓扑,包含m层链表,每层链表包含多个节点,每一节点包含一个子任务,每层链表上的子任务并行执行,前一层链表的所有子任务均执行结束后,进入下一层链表,m为大于等于1的自然数;

任务上下文是指任务运行的环境,包括运行时所需要的数据资源、计算机资源。

所述步骤(1.2)的实现方法如下:

(3.1)即时任务一进入即时任务队列,调度器立即将其取出放入即时任务执行器池;

(3.2)对于非即时任务,调度器根据任务类型循环查询对应执行器池中空闲执行器个数,从任务等待队列中采用滑动窗口调度方式获取符合条件的任务,提交给对应的执行器池。

所述步骤(3.2)的实现方法如下:

步骤一、根据任务类型查询此时对应执行器池空闲执行器个数,假设对应执行器池空闲执行器个数为n,则将调度窗口大小w的值设为n;

步骤二、将调度窗口起始位置置于任务选取指针p所指向的任务位置上;

步骤三、若w大于0且调度窗口内有任务,获取任务选取指针p所指向的任务,查询该任务的前驱任务列表,检查前驱任务列表中各前驱任务的状态;反之若w为0或窗口内已无任务,跳转执行步骤六;

步骤四、判断所有前驱任务是否均已执行完毕,若是,则从任务等待队列中取出该任务,任务状态标记为“计划执行”,调度窗口大小调整为w=w‐1,进入步骤五;若否,进入步骤五;

步骤五、任务选取指针p和调度窗口一同滑动到队列下一任务位置上,跳转执行步骤三;

步骤六、将所有从步骤四中取出的任务提交给对应执行器池执行,完成后进入步骤七;

步骤七、判断计时时间t是否已达到选取指针回溯时间t,所述计时时间t在调度器启动时从0开始计时,若达到,则将任务选取指针p重新指向任务等待队列起始位置,计时时间t重置为0,重新计时,跳转执行步骤一;若未达到,跳转执行步骤一;其中指针回溯时间t要大于5*执行时间划分阈值。

所述步骤三中检查前驱任务状态的方法为:根据前驱任务的任务类型,首先在对应任务等待队列中进行搜索,若找到该任务,则该前驱任务为未执行状态;若未找到该任务,则在已完成任务数据库中查询,若数据库中也未找到该任务,则说明上层应用还未提交任务或者任务正在执行,即前驱任务为未执行状态;若找到,则前驱任务为执行完毕状态。

所述步骤(2.1)的具体流程如下:

步骤一、当接收到任务时,执行器提取对应的子任务二级链表,取出子任务二级链表头head中的指针域所指向的第一层链表,作为当前链表;

步骤二、判断当前链表是否为null,若为空,结束流程;若不为空,取出当前链表头中指针域所指向的节点作为当前节点,并将该节点的子任务分配给一个独立的线程执行;

步骤三、取当前节点中指针域所指向的下一节点,若为空,待当前链表所有子任务均执行结束后,执行步骤四;若不为空,将该下一节点作为当前节点,将当前节点子任务分配给一个独立的线程执行,然后继续执行步骤三;

步骤四、取出当前链表指针域所指向的下一链表,若为空,说明任务执行完成,结束;若不为空,将其作为当前链表,跳转到步骤二继续执行。

在调度和处理的同时,实时采集执行器执行情况,统计后反馈给调度器,调度器据此调整任务所在任务等待队列以及执行器池执行器数量,实现自适应调整。

调整任务所在任务等待队列的方法如下:

采集长任务执行器池和短任务执行器池中每一任务执行所花费的时间,然后按业务类型统计每种业务类型的任务平均执行时长,反馈给调度器,调度器依据反馈信息判断任务类型划分是否恰当,若不恰当,则修改任务类型,将其调整到新的任务等待队列中。

调整执行器池执行器数量的方法如下:

周期性统计长任务执行器池和短任务执行器池中空闲执行器个数,及时反馈给调度器,调度器查询此时各任务等待队列中任务情况,并根据查询结果重新分配两个执行器池执行器数量,把空闲执行器释放给执行器不够用的执行器池。

与现有技术相比,本发明具有如下有益效果:

(1)本发明基于任务/子任务两个层级进行任务调度和处理,进一步细化了调度的粒度,能更充分地利用系统资源,提高并行度,有效解决了任务间复杂依赖关系所带来的并行调度困难问题,实现了大规模数据处理任务有序、高效的并行处理,降低了整体执行时间。

(2)本发明在任务调度和处理过程中充分考虑任务间依赖关系和业务逻辑顺序,很好解决了存在依赖关系的任务之间运行先后顺序以及多个子任务同时运行冲突等问题,实现了任务合理有序的调度,避免了资源使用混乱,提高了任务处理效率。

(3)本发明采用结果统计和反馈机制,自适应进行调整、优化调度,实现系统资源动态、合理分配,能及时应对业务变化,具有高灵活性。

附图说明

图1为本发明总体结构图;

图2为任务相关属性示意图;

图3为滑动窗口调度算法流程图;

图4为二级链表结构示意图;

图5为执行器执行任务流程图;

图6为短任务执行结果统计及反馈示意图;

图7为任务调度过程示意图。

具体实施方式

为了使大规模数据处理任务有序、高效并行执行,本发明方法将任务从两个层级进行处理,旨在最大限度的提高并行量,减少任务等待或执行时间:第一级,任务层级,每个任务都声明其依赖的前驱任务,调度器据此建立拓扑,确保任务按照依赖次序执行,无依赖关系的任务可以并行执行;第二级,子任务层级,将任务按动作或功能划分成一系列的子任务,各子任务所需数据、资源已由第一级任务层加载,划分子任务的目的是进一步提高并行度,将无资源冲突、无执行顺序关联的子任务分配给多个线程同时执行。

数据处理任务是指数据采集、数据加工、数据融合、数据分析等任务,特征通常表现为任务规模大、执行时间长、任务间相互依赖关系复杂。依据任务执行时间长短,设定执行时间划分阈值,把不同业务类型的任务分为三个类型:长任务、短任务、即时任务,例如:可将海量数据采集、数据深度分析、数据加工转换等任务归为长任务,控制、通信、交互等任务归为短任务,实时性要求高的任务归为即时任务。为了避免长任务执行时间过长可能导致短任务或即时任务迟迟得不到执行,本发明采用为长任务、短任务、即时任务分别建立任务等待队列和执行器池,来将这三类任务分开调度和处理。为了进一步提高大数据任务读写效率,应对海量规模任务情况,各任务等待队列任务存储于redis内存数据库中,所有已完成的任务最终存储于hbase数据库中,便于后续查询。

如图1所示为本发明的总体结构图。本发明首先将数据处理任务按类型放置于长、短和即时三个任务等待队列中,然后由调度器按任务间依赖关系合理调度给执行器执行;执行器执行任务时按照业务逻辑拆分为子任务,并将子任务有序地分配给多线程并行处理;在调度和处理的同时,采用运行信息采集统计并反馈的机制进行资源自适应调整。方法详细描述如下:

(一)任务接收

上层应用在提交任务的同时,附带上任务的相关属性,构成如图2所示的基本信息,基本信息主要包括:任务名称、任务类型、业务类型、前驱任务列表、任务上下文和子任务二级链表。其中,任务类型是指上层应用根据预估任务所需执行时间分为三类:长任务、短任务、即时任务;业务类型是指上层应用按业务功能对任务进行分类,如:数据采集任务、数据分析任务、数据加工任务等,主要用于信息统计;前驱任务列表中列出的是当前任务所直接依赖的全部前驱任务,只有在前驱任务执行完毕后当前任务才可以执行;

任务上下文是指任务运行的环境,包括运行时所需要的数据资源、计算机资源。

子任务二级链表中每一节点包含一个子任务,二级链表结构记录了记录了子任务的执行顺序二维拓扑,二级链表中每层链表上的子任务可以并行执行,只有当前一层所有子任务均执行结束下一层子任务才可以执行。以图4所示情况为例,任务原本按子任务1、子任务2、一直到子任务9顺序执行,但子任务1、子任务2、子任务3无资源访问冲突及执行先后关系,故将其放在同一层链表中并行执行,子任务5执行依赖子任务4结果,故将其放置于不同层链表中,而子任务6执行不依赖子任务4和子任务5,故将其提前至与子任务4同一层。

本发明方法在接收到任务后,为其创建一个全局唯一标识,然后将上层应用提交的任务按任务类型放置于相应的任务等待队列中,等待调度。

例如,上层应用在提交一个1t的大数据分析任务时,需同时标记任务为长任务、数据分析类任务,并列出前驱任务列表、子任务二级链表和任务上下文。本发明方法将为其创建唯一标识,并将其放置于长任务等待队列尾部,设置其状态为“就绪”。

(二)任务调度

由调度器来完成任务的调度,对不同任务等待队列中的任务采用不同的调度策略:对于非即时任务(长任务和短任务),每次从任务等待队列取出的任务数量与对应执行器池当前空闲执行器个数有关;对于即时任务,为了保证其执行的实时性,每个任务到来后立即取出放入即时任务执行器池中。

具体的,对于非即时任务,调度器循环查询对应执行器池中空闲执行器个数,从任务等待队列中采用滑动窗口调度方式获取符合条件的任务,提交给对应执行器池。如图3所示,任务调度基本流程为:

步骤一、根据任务类型查询此时对应执行器池空闲执行器个数,假设对应执行器池空闲执行器个数为n,则将调度窗口大小w的值设为n;

步骤二、将调度窗口起始位置置于任务选取指针p所指向的任务位置上;

步骤三、若w大于0且调度窗口内有任务,获取任务选取指针p所指向的任务,查询该任务的前驱任务列表,检查前驱任务列表中各前驱任务的状态;反之若w为0或窗口内已无任务,跳转执行步骤六;

步骤四、判断所有前驱任务是否均已执行完毕,若是,则从任务等待队列中取出该任务,任务状态标记为“计划执行”,调度窗口大小调整为w=w‐1,进入步骤五;若否,调度窗口大小保持不变,进入步骤五;

步骤五、任务选取指针p和调度窗口一同滑动到队列下一任务位置上,跳转执行步骤三;

步骤六、将所有从步骤四中取出的任务提交给对应执行器池执行完成后进入步骤七;

步骤七、判断计时时间t是否已达到选取指针回溯时间t,所述计时时间t在调度器启动时从0开始计时,若达到,则将任务选取指针p重新指向任务等待队列起始位置,计时时间t重置为0,重新计时,跳转执行步骤一;若未达到,跳转执行步骤一;其中指针回溯时间t要大于5*执行时间划分阈值。

其中,在调度算法初始化时,将任务选取指针p指向队列起始位置。定义选取指针回溯时间t,来保障队列中之前不具备执行条件的任务能够在合理时间范围内重新调度,即计时时间t达到选取指针回溯时间t后,任务选取指针p重新指向队列头部,初始化计时t设为0。

步骤三中检查前驱任务状态方法为:根据前驱任务类型,首先在对应任务等待队列中按该任务唯一标识进行搜索,若找到该任务,即前驱任务为未执行状态;若队列中无该任务,则继续在hbase已完成任务数据库中查询。若hbase数据库中也未找到该任务,则说明上层应用还未提交任务或者任务正在执行,即前驱任务为未执行状态;若找到,即前驱任务为执行完毕状态。

对于即时任务,采用事件触发机制进行调度,以保证任务及时调度。任务在放入即时任务任务等待队列时,触发事件向调度器发送取任务的消息,调度器随即将该任务取出,提交给即时任务执行器池,即时任务执行器池大小不作限制,可为每一任务分配一个执行器来执行。

以图7所示情况为例,解释调度过程:

步骤一、查询此时空闲执行器个数n=3,任务选取指针p指向任务1;

步骤二、设置调度窗口w=3,将调度窗口置于指针p指向所指向位置;

步骤三、获取任务1的前驱任务列表,其前驱任务为任务3,检查任务3执行状态,发现其为就绪态,故任务1不具备执行条件,将调度窗口向后滑动一位、指针p指向任务2;

步骤四、获取任务2的前驱任务列表,发现其无前驱任务,将任务2取出,其任务状态标记为“计划执行”,同时调整调度窗口大小w=2,并将窗口向后滑动一位,指针p指向任务3;

步骤五、获取任务3的前驱任务列表,发现其无前驱任务,将任务3取出,其任务状态标记为“计划执行”,同时调整调度窗口大小w=1,并将窗口向后滑动一位,指针p指向任务4;

步骤六、获取任务4的前驱任务列表,其前驱任务为任务2,检查任务2执行状态,发现其为计划执行态,故任务4不具备执行条件,将调度窗口向后滑动一位、指针p指向任务5;

步骤七、获取任务5的前驱任务列表,发现其无前驱任务,将任务5取出,其任务状态标记为“计划执行”,同时调整调度窗口大小w=0,指针p指向任务6;

步骤八、发现调度窗口大小为0,说明已经取出3个任务,将这三个任务提交给执行器池执行,本次调度结束,下一次调度从指针p指向的任务6继续进行。

(三)任务执行

建立长任务、短任务、即时任务三个执行器池,每个执行器池各自拥有一定数量的执行器,即时任务执行器池拥有的执行器个数不作限制,每次收到一批任务后,创建对应数量的执行器来处理;非即时任务执行器池的执行器个数预先设定,并随着运行能自适应进行调整。执行器池接收来自调度器分配的任务,由执行器来负责任务的具体执行。为了提高执行效率,执行器采用多线程并行方式,以子任务为最小单位进行处理。

执行器在获得任务后,根据任务携带的子任务二级链表中指定顺序,每次取出一层链表,为该层链表上每一子任务分配一个线程来并行处理,直到待该层所有子任务都执行结束,再处理下一层链表,图4为二级链表结构示意图。

以图4所示二级链表为例,任务具体执行流程如图5所示:

步骤一、取出二级链表头head中sub指针所指向的链表chain1,取出chain1上所有子任务(子任务1、子任务2、子任务3),为每一子任务分配一个独立线程执行,并记录当前时间t1;

步骤二、若子任务1执行失败,立即将其重试,若多次重试均不成功,直接结束该任务执行,将任务重新放回任务等待队列尾部。否则,待子任务1、子任务2、子任务3全部执行完毕后,取出chain1的下一层链表chain2,取出chain2上所有子任务,为每一子任务分配一个独立线程执行;

步骤三、子任务4和子任务6全部执行完毕后,取出chain2的下一层链表chain3,取出chain3上所有子任务,为每一子任务分配一个独立线程执行;

步骤四、子任务5执行完毕后,取出chain3的下一层链表chain4,取出chain4上所有子任务,为每一子任务分配一个独立线程执行;

步骤五、子任务7、子任务8、子任务9执行完毕后,发现chain4无下一层链表,说明任务执行完毕,将任务状态标记为执行完成,并存储于hbase数据库中。记录此时时间t2,得到该任务执行时间。

本方法对任务执行异常采取子任务级重试策略来实现细粒度控制,即发现某一子任务执行失败后,重试该子任务,若多次重试若仍不成功,结束该任务执行,将该任务重新放置到对应任务等待队列尾部等待重新调度。

(四)自适应调整

为了充分、合理利用系统资源,避免执行器池中执行器数量分配不均、任务类型划分不当,最大限度提高运行效率,本方法采集执行器执行情况并进行统计分析,将统计信息反馈给调度器进行自适应调整。图6以短任务为例,示意自适应调整的过程。自适应调整主要分为两方面:

一、为了防止上层应用划分任务类型划分有误,本发明方法监测长任务和短任务执行器池中每一任务执行所花费的时间,然后按业务类型统计各种业务任务平均执行时长,及时反馈给调度器。调度器依据统计信息判断任务归类是否恰当,若不合适,则调整任务所在任务等待队列。例如,上层应用将数据分析任务设为短任务,但经统计发现数据分析任务平均执行时长为2小时,超过了执行时间划分阈值,说明该任务应该为长任务。调度器则将短任务任待队列中所有数据分析类型任务移动到长任务任务等待队列尾部。

二、周期性统计长任务和短任务执行器池中空闲执行器个数,及时反馈给调度器,调度器查询此时各任务等待队列任务情况,并根据统计结果重新分配两个执行器池执行器数量,把空闲执行器释放给执行器不够用的执行器池。

以图6所示情况为例,解释说明结果统计和反馈机制。当前有a、b、c三种业务类型数据,上层应用将业务类型a、b设置为短任务,业务类型c设置为长任务。调度器将短任务等待队列中符合条件的任务取出,交给执行器执行。监测各任务执行时间,然后统计业务类型a、b的任务平均执行时间ta、tb,发现ta<t划分阈值、tb>t划分阈值,说明业务类型b的业务类型不正确,将情况反馈给调度器,由调度器将短任务等待队列中所有业务类型为b的任务移动到长任务任务等待队列尾部,并将这些任务标记为长任务。

同时,周期性统计长任务和短任务执行器池中空闲执行器个数,反馈给调度器。以长任务空闲执行器过多情况为例:长任务的空闲执行器个数f1、任务等待队列中任务数量为q1,短任务的空闲执行器个数f2、任务等待队列中任务数量为q2。定义空闲率为空闲执行器个数f与任务等待队列中任务数量q的比值,若长任务和短任务的空闲率差值超过阈值,且q1、q2不同时为0,则说明当前执行器数量分配不合理,为了实现负载均衡,将长任务执行器池中n个执行器调整给短任务执行器池,n大小由下面公式计算:

式中,floor()为向下取整函数,并要求q1+q2≠0。

此外,本发明还提供友好的对外接口服务,可将运行结果和统计结果按需提交给上层应用,供其参考使用。

本发明说明书中未作详细描述的内容属于本领域专业技术人员的公知技术。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1