Chinaunix首页 | 论坛 | 博客
  • 博客访问: 51247
  • 博文数量: 42
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 480
  • 用 户 组: 普通用户
  • 注册时间: 2014-04-03 15:29
文章分类
文章存档

2015年(14)

2014年(28)

我的朋友

分类: 信息化

2015-02-03 14:00:02

              LMT NEW PBS作业调度运算系统对多队列作业的运算

    在网格环境下,如何将分布的计算资源整合起来,根据不同用户提交的作业请求,充分利用网格中的资源,合理调度作业,提高系统的利用率,一直是网格计算要解决的核心问题。作业调度系统正是解决以上问题的功能部件,其基本功能是接受用户的作业请求,根据用户作业特征,对作业队列进行排序,从全局资源池中选取合适的资源,对作业进行资源分配,并监督用户作业的执行。可见网格作业在真正执行前要进行一系列的处理,比如请求解析、资源选择、作业调度和最终提交,目前的大多数作业调度系统一般采用先来先服务( First2Come, First2Service,FCFS)策略,这就带来了以下缺点:

1)缺乏灵活性,无法满足用户的某些特殊需求;

2)缺乏统一的组织管理,作业在进行处理的过程中如果出错,将无法找到其准确的位置,从而影响到进一步的处理。

    为此,可以把处理作业的过程按照功能划分成若干个阶段,每个阶段对应一个处理队列,这些队列首尾相连,就构成了一个多队列结构;另外,为了便于对作业的管理,可以设置一个控制中心,它负责将用户的作业请求封装成一个对象,同时可以灵活地控制作业对象在各个处理队列的入队和出队等操作,以上就是多队列作业处理环境的设计思想。

1 作业处理环境的设计

1. 1 作业处理环境的框架结构

    作业处理环境由作业控制中心和多队列结构构成,在处理作业的过程中,作业处理环境还需要与网格服务系统中的其他服务和数据库进行交互。

 

                            图1 作业处理环境框架

1. 2 作业处理环境的组成

1. 2. 1 作业控制中心

作业控制中心由作业控制器、作业对象工厂和作业对象组成。

作业控制器( Job Controller)  作业控制器有三个功能:

一是接收用户的调用请求,包含作业提交、控制、查询等;

二是初始化作业处理环境,即启动多队列结构中的每个处理队列所对应的线程;

三是协调、控制作业对象工厂和处理队列处理用户作业请求。

    作业对象工厂(Job Object Factory)  负责创建、管理作业对象。包括对作业对象的查询、销毁以及作业对象的持久化与恢复等。作业对象的持久化是指将作业运行时信息封装在作业对象里,通过序列化将其存储在数据库中。系统通过作业对象的持久化与恢复,适时保存作业信息,支持作业的检查点恢复。作业对象工厂的设计借鉴了编程模式中的工厂模式[ 5 ]。

作业对象(Job Object)  为了方便对作业请求进行处理,可以将作业请求封装成一个对象,一个作业对象有如下几个特点: 1)作业对象代表用户作业,包含与作业有关的所有信息,贯穿于作业处理的全过程; 2)所有的作业处理都是基于作业对象进行的; 3)作业处理各环节、各模块间通过作业对象保存,传递信息; 4)作业处理相关环节通过作业对象相互调用。

    作业对象由两类信息组成:

作业请求信息 与请求相关的信息,即作业描述文档。包括一般信息、执行信息、属性信息、数据信息、扩展信息等内容。

    作业处理信息 与作业处理过程的相关信息。包括作业ID号、作业状态、业提交次数等用于作业处理的信息。作业对象中包含了与整个作业处理过程相关的所有信息,这些信息的充分性既保证了作业能够被完整地处理,又使作业保持了高度的独立性。

1. 2. 2 多队列结构

    多队列结构由四个处理队列构成,分别是:预处理队列 负责对作业进行预处理,最终为每个到达的作业筛选出可用的资源地址。

调度队列 负责对所有到达的作业按照其可用资源地址进行重新排队,各个作业对象被排队到新的子队列中。然后,对于每个子队列,系统采用多策略的模式进行调度,最终筛选出每个子队列中优先级最高的作业。

    资源选择队列 负责对由上一个队列选出的作业进行资源选择,最终为每个作业选择最合适的执行地址。

提交队列 负责将每个作业提交到执行地址上执行。

    关于多队列结构还要说明以下几点:

1)每个处理队列本身是一个线程,线程一旦启动起来就可以自动处理作业。为了规范管理作业处理环境中的每个处理队列,系统设计了一个队列模板,定义了一些基本操作,比如入队、出队等,所有的处理队列都是在队列模板的基础上创建的。

2)作为作业对象的容器,处理队列以线程池的形式建立,具有负载平衡的能力,即可以根据设置线程池容量的大小来控制队列中作业对象的数目,当作业对象数目达到容量上限时,新来的作业对象将被排队等待。处理队列为线程池中的每个作业对象创建一个处理进程,负责对作业进行具体的处理。

3)每个处理进程都包含一条处理链,处理链是一系列处理动作的集合,每个处理动作负责对作业对象进行特定的处理。通过修改配置文件JMSConfig,可以灵活添加或删除特定的处理动作,从而实现了可插入的软件设计方法。

1. 3 处理队列的工作原理

    作业处理环境在处理作业对象前首先要进行初始化,初始化工作负责把四个处理队列首尾相接形成一个多队列的作业处理环境,并且把每个处理队列的线程都启动起来,线程一旦启动就可以自动运行。每个处理队列一旦启动,就会等待作业对象的加入。由于四个处理队列都是从相同的队列模板产生的,所以它们有着相似的处理流程。图2给出了处理队

列的一般工作流程。

    作业的入队、出队操作很简单,就是加入和离开一个哈希表并更新数据库。处理队列采用了循环结构对作业对象进行批量处理,每间隔一段时间就从哈希表中依次读取一定数量的作业放入到线程池中,检查当前线程池中的作业数量,只要线程池不发生上溢,就按照FCFS的原则为每个作业创建一个处理进程。处理进程负责具体的处理工作,它会调用一个名字叫做HandlerChain的处理链来决定要采用的处理动作。

这里面有几点要进行说明。

1)所谓“上溢”在数据结构[ 8 ]中泛指队满还入队的操作,在作业处理环境中是指处理队列的线程池的容量达到上限的情况。之所以加上这个判断条件是为了保持容器的负载平

衡,提高系统的处理效率。

2)虽然四个队列的结构相似,但是它们所完成的功能却完全不同,这就决定了在各自的处理链中要采用不同的处理动作。为了屏蔽这种内在的差异,系统采用了读取配置文件JMSConfig的方法。这样做有两点好处,一是保证了操作形式上的统一性,几个处理队列都是通过读取这个配置文件来决定要采用的处理动作;二是保证了配置上的灵活性,可以根据用户的需要动态修改配置文件,添加或删除所需的处理方法,从而实现了一种可插入的软件设计技术。

3)这个流程是前三个处理队列工作的一般流程,但调度队列在各个处理环节上采用了特殊的处理方法,这是由它的功能决定的。

4)作业控制中心接收到用户的调用请求后,就可以控制作业进出某个队列被相应地处理。作业对象一般情况下要依次经过四个处理队列的处理,实际运行当中,每个处理队列都处于活动状态等待处理作业,但并不是每个作业对象在任何情况下都要被这四个队列做依次处理,要根据作业控制中心下达的指令来确定。

    比如作业控制器接收到的用户请求是作业终止,首先会根据作业号在数据库查询得到该作业所处的位置,然后就会下达作业终止命令,强制该作业从当前所处的队列中出队,并将实时信息保存到数据库中。如果接收到的是用户作业重启的请求,作业控制器就会根据作业号从数据库中查询该作业对象的信息,然后下达作业重启的命令,强制该作业从原来的暂停位置重新做入队操作。

 

                             图2 处理队列的一般工作流程

2 作业处理环境的实现

2. 1 作业控制中心的实现

作业控制中心的工作流程如图3所示。

    作业控制中心接收用户提交的各种作业请求,下面以提交作业为例,介绍一下作业提交的步骤。首先,通过作业对象工厂把这个作业请求封装成一个作业对象。通过调用作业工厂的初始化方法,完成对作业对象的初始化工作:包括初始化作业的ID号、作业的初始优先级、初始状态、安全身份等。其次,将作业对象序列化,调用数据库存取接口完成作业对象存入数据库操作。第三,由作业控制中心转发指令。作业控制中心接收到用户提交的调用指令后,首先初始化作业处理环境,然后根据作业对象的状态将作业对象入队到相应队列,由于本次接受到的是作业提交指令,所以控制中心将作业对象入队到预处理队列。

    注意,如果控制中心接收到用户销毁作业指令的话,会根据待销毁作业对象的ID号,从数据库中取出相应的作业对象,查看该作业的状态信息,判断作业所在的处理队列,然后命令作业做出队操作。

 

                 图3 作业控制中心的工作流程

2. 2 预处理队列的实现

    预处理队列的处理分为三个步骤:入队操作、循环处理和出队操作。其中,入队和出队的操作比较简单,循环处理是关键。图4给出了预处理队列的工作流程。

 

                         
                                                   图4 预处理队列的工作流程

1)入队操作。将作业对象放入一个名字叫作queue的哈希表中,同时更新数据库中作业对象的状态信息,表明此时作业处在预处理队列阶段。更新数据库的目的是防止系统突然掉电等意外情况的发生,从而方便作业对象的重启。

2)循环处理。该循环处理结构负责定期对加入到本队列的作业对象按照FCFS的原则进行批量处理,其工作按照

图2中所示的一般工作流程进行。本队列共采用了五个处理动作。

需求解析 负责解析作业对象中的作业描述文本,将文本中要求使用的软硬件环境信息和资源地址信息解析出来。

权限检查 通过调用虚拟社会组织(Virtual Organization,VO)服务提供的接口,获得用户有权使用的资源地址向量,和上一步取得的用户要求使用的资源地址向量取交集,并以此更新作业对象的可用资源地址向量值。

类型检查 负责判断作业是否是应用类型作业,如果是则调用应用服务接口直接获得可用的资源地址信息;否则,进入下一步。

有效性检查 调用全局信息服务接口,获得满足作业执行软、硬件环境要求且在当前网格环境中可使用的资源地址向量。再和前面取得的资源地址取交集,并以此更新作业可

用的资源地址向量值。

合法性检查 对更新过的作业的资源地址向量的大小进行判断检查。作业对象经过以上处理动作处理后,携带着的是最新的可用资源地址。

3)出队操作。出队操作完成的任务是:将作业对象从哈希表中删除,然后,携带着必要的信息自动入队到下一个处理队列中。

2. 3 调度队列的实现

在本层队列,网格作业在各个服务节点的执行次序将被最终确定,所以此模块的设计是作业处理流程中最关键的步骤。图5给出了调度队列的工作流程。

 

                       图5 调度队列的工作流程

调度队列负责把所有入队的作业对象重新排队,它的排队规则是以作业对象携带的可用资源地址为索引项,把作业对象排队到各个子队列相应的位置。这意味着资源地址与子队列是一对一的关系。每个子队列都包含一个列表,列表里存储着一组有着共性的作业对象,这个共性指的就是拥有相同的资源地址。也就是说,拥有相同的资源地址的作业对象都排队到同一个子队列中。系统根据相应的策略对每个子队列所包含的作业对象进行调度,在调度的过程中,采用了多策略的调度模式。

重新排队的特性使得本层队列的设计不同于其他三个处理队列,作业对象在调度队列中的处理步骤也是由入队、循环处理和出队构成。

1)入队操作。主要是完成重新排队的工作。每入队一个作业对象,系统首先检查它所携带的可用资源地址(URL) ,根据这些地址创建一个哈希表(QueueTable) 。该表以作业对象的URL为索引,键值是子队列( JMSQueue)对象。一旦发现某个作业对象有新的资源地址,就为此地址创建一个子队列。

某个作业对象进入作业调度队列时可能携带着多个可用资源地址,系统根据这些URL值将其分别排队到相应的子队列中。一个子队列可以包含多个作业对象,而一个作业对象也可以存储在多个子队列中,子队列和作业对象是多对多的关系。图6给出了一种可能的作业排队情形。

 

                        图6 作业在子队列中的排队示意图

通过入队操作,每个进入调度队列的作业对象其实有了两个排队顺序,一个是在整个调度队列这个大队列中的排队顺序,另一个是在以资源地址作为索引项的子队列这样的小队列中的排队顺序。

2)循环处理。调度队列的线程一旦被启动,就采用一种循环处理的结构,定期对本队列中的每个子队列进行调度。调度过程中采用的是一种多策略的调度模式,采用了两种算法来调整子队列中作业的优先级。调度队列的调度链类包含四个处理动作。基于用户满意度的优先级调整 算法借助效用函数理论,根据实际调度过程中用户的等待心理,构造了用户不满意度曲线,这条曲线最终确定了作业的优先级随时间变化的趋势,算法的好处是使作业优先级的调整符合用户的心理。

基于调度频率的优先级调整( FrequencyPriorityAdjust2Algorithm)  算法根据作业的调度频率调整其优先级,通过降低某些阻塞型作业的优先级,使各类作业有了公平竞争的环境,提高了计算资源的利用率。

作业选择 为每个子队列选择出优先级最高的作业,并把子队列所对应的URL作为作业的最终执行地址Endpoint。

可用性检查 对于每个子队列选择出的作业,把它的调度次数加1,然后调用全局信息服务,检查它的Endpoint是否处于可用状态。如果可用,就把该作业对象出队;如果不可用,就重新参加调度。

基于用户满意度的优先级调整和基于调度频率的优先级调整分别采用了两种调度算法,经过这两个调度动作,每个子队列中作业的优先级已经被调整完毕,系统要求每个子队列中只有优先级最高的作业(即作业选择)才能被下一个处理动作(即可用性检查)进行处理。

作业选择的任务就是按照作业优先级的大小为每个子队列选择出优先级最高的作业作以标记,并且把子队列的索引值作为此作业对象的一个候选地址,这个索引值就是图6中哈希表的URL,这些被标记的作业便拥有了得到真正执行的权利。

并不是每个子队列选择出来的被标记的作业都能得到真正执行,这些被选择的作业所携带的所有的候选地址此时在网格范围内不一定可用,必须进行检查。系统设计了可用性检查处理动作,通过调用信息服务提供的接口,对每个子队列选择出的作业的候选地址的有效性进行检查,那些网格无法满足的作业将重新在子队列中排队等待调度,只有通过检查的作业对象才能顺利地做出队操作。

3)出队操作。经过四个处理动作的处理后,每个子队列中优先级最高并且其执行地址确实能被网格系统满足的作业, 分别从大队列(调度队列)和每个小队列(子队列)做出队操作,并自动入队到下一个队列即资源选择队列。

2. 4 资源选择队列和提交队列的实现

这两个模块的设计思路与预处理队列模块基本相同,唯一不同之处在于所采用的处理动作不一样。从调度队列出队后的每个作业可能包含多个候选地址,

例如图6中的作业a,如果经过调度后它在子队列JMSQueue1和JMSQueue2都可能是优先级最高的作业,那么它就包含两个候选地址URL1和URL2。资源选择队列的主要任务就是针对入队的每个作业对象,在候选地址中选取其最适合的资源地址作为作业的最终执行地址。然后,作业出队并自动入队到下一个队列即提交队列。提交队列负责把进入该层的作业提交到最终执行地址上真正执行。

经过四个处理队列的处理,作业对象就完成了在作业处理环境的流程,或者继续留在调度系统参加排队,或者得到最终的执行。

3 结语

本文提出了一种基于多队列思想来构建作业处理环境的思路,由作业控制中心和多队列结构组成的作业处理环境,采用分阶段的方式处理网格作业。它的特点是:由四个处理队列构成的多队列结构将作业的处理流程划分成几个阶段,每个阶段完成特定的功能,它们彼此联系而又相互区别;作业控制中心负责统一管理作业对象在多队列结构中的操作,它的存在使得系统对作业处理流程的控制更加灵活。

 

 

阅读(380) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~