具体实施方式
为了使本技术领域的人员更好地理解本公开方案,下面将结合本公开示例性实施例中的附图,对本公开示例性实施例中的技术方案进行清楚、完整地描述。
在本公开的说明书和权利要求书及上述附图中的描述的一些流程中,包含了按照特定顺序出现的多个操作,但是应该清楚了解,这些操作可以不按照其在本文中出现的顺序来执行或并行执行,操作的序号如101、102等,仅仅是用于区分开各个不同的操作,序号本身不代表任何的执行顺序。另外,这些流程可以包括更多或更少的操作,并且这些操作可以按顺序执行或并行执行。需要说明的是,本文中的“第一”、“第二”等描述,是用于区分不同的消息、设备、模块等,不代表先后顺序,也不限定“第一”和“第二”是不同的类型。
下面将结合本公开示例性实施例中的附图,对本公开示例性实施例中的技术方案进行清楚、完整地描述,显然,所描述的示例性实施例仅仅是本公开一部分实施例,而不是全部的实施例。基于本公开中的实施例,本领域技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本公开保护的范围。.
图1示出根据本公开一实施方式的弹性任务调度方法的流程图。该方法可以包括步骤S101、S102和S103。
在步骤S101中,响应于接收到的任务控制请求,将目标任务放入队列并检查队列中的任务;取出队列中的任务,读取任务所需的资源数值,并发出资源申请请求。
在步骤S102中,响应于资源申请请求,在资源池中检索是否存在空闲资源。
在步骤S103中,当检索出资源池中存在空闲资源时,根据资源申请请求中记载的任务所需的资源数值分配空闲资源,其中,根据任务所需的资源数值对资源进行分片,建立资源分片与代理实例的关联关系,代理实例与资源实例一对一映射。
在本公开的一个实施例中,资源可以是Spark资源。在本申请的实施例中,spark指的是一种大数据分布式内存计算平台。资源申请请求可以指的是向spark平台申请资源的请求。根据本公开的方案,为了获得更好的用户体验,可以让小任务与大任务共享spark资源实例(如:spark context)。由于spark平台的作业调度器本身是线程安全的,允许多线程任务提交。因此,可以在大任务空闲时,交叉执行小任务。一方面可以提升小任务的响应时间,另一方面可以提升资源的利用效率。
在本公开的一个实施例中,任务控制请求可以是由用户提交的,也可以是由系统定时器提交的。在本公开的一个实施例中,当希望利用诸如Spark资源之类的平台资源处理某个业务时,可能会有一批任务需要执行,因此,可能会由用户或系统定时器提交一批任务控制请求。在本公开的一个实施例中,可以根据任务控制请求,将任务控制请求所对应的目标任务放入队列,队列中可以排列有多个任务。其中,所述队列可以是本地队列。
在本公开的一个实施例中,资源数值指的是执行任务时所需的资源的量。在本公开的一个实施例中,对提交的作业资源需求和诸如spark资源的资源实例进行数值虚拟化后,可以确定资源数值。因此,可以读取任务所需的资源数值,并发出资源申请请求。
在本公开的一个实施例中,资源池指的是映射到本地主机上的平台的资源池,例如,spark平台的资源池。
在本公开的一个实施例中,针对任务所需的资源数值分配空闲资源是弹性的资源分配方式。弹性的资源分配方式指的是任务的资源需求可以动态计算、也可静态配置,根据需求从空闲的资源实例中选择合适的资源。
在本公开的一个实施例中,根据任务所需的资源数值对资源进行分片指的是资源已经数值化,资源分片对应于所需的资源数值,将所需的空闲资源的分片分配给任务,另外,记录资源的空闲数值以及已用数值。在本公开的一个实施例中,建立资源分片与代理实例的关联关系指的是需要建立资源分片与代理实例之间的关系,以便管理资源分片。
在本公开的一个实施例中,代理实例作为资源实例在本地的映射与资源实例之间存在一对一映射关系。
在本公开的一个实施例中,如图1所示,还可以包括步骤S104。在步骤S104中,当检索出资源池中不存在空闲资源时,获取一个代理实例,并对代理实例所关联的资源虚拟数值化,针对任务所需的资源数值分配空闲资源,其中,空闲资源属于代理实例所关联的资源,所述代理实例与资源实例一对一映射。即,在本地不存在具有空闲资源的代理实例,或者不存在具有足够空闲资源的代理实例的情况下,需要获取一个代理实例。对代理实例所关联的资源虚拟数值化可以使得根据任务所需的资源数值将资源适当地分配给对应的任务。例如,将代理实例中的资源在本地虚拟数值化,总数值为100,此时,代理实例的资源的初始空闲度为100。在一个例子中,当任务所需的资源数值是20时,可以将空闲度为100的代理实例的资源中的20份资源分配给任务。可以理解,代理实例的资源总数值为100仅仅是示例,总数值可以为任意值。
在本公开的一个实施例中,步骤S103包括:在资源池中检索空闲度最低且满足资源申请请求中记载的任务所需的资源数值的代理实例。例如,有两个代理实例,资源总数均为100,第一个代理实例的空闲数为50,第二个代理实例的空闲数为30。此时,当任务所需的资源数值为20时,将检索到的两个代理实例中的空闲度最低的第二个代理实例中的资源分配给该任务。在此情况下,可以最充分地利用代理实例中的空闲资源。也可以认为,此时是从空闲的资源实例中选择了最优的资源实例。
在本公开的一个实施例中,如图1所示,还可以包括步骤S105。在步骤S105中,在针对任务所需的资源数值分配空闲资源后,响应于作业的提交向服务集群申请实际资源。即,代理实例是资源实例的本地映射,因此,在针对任务所需的资源数值分配空闲资源后,会需要向服务集群(例如,spark集群)进行作业提交,以申请实际资源。
在本公开的一个实施例中,在针对任务所需的资源数值分配空闲资源后,响应于作业的提交向服务集群申请实际资源,包括:根据租户配置,对实际资源进行分组隔离,其中,可以将不同类型的任务提交到对应的资源实例,以根据业务属性进行资源隔离。通过资源隔离,可以按业务需求,托管不同规模的资源实例。
在本公开实施方式中,通过响应于接收到的任务控制请求,将目标任务放入队列并检查队列中的任务;取出队列中的任务,读取任务所需的资源数值,并发出资源申请请求;响应于资源申请请求,在资源池中检索是否存在空闲资源;当检索出资源池中存在空闲资源时,根据资源申请请求中记载的任务所需的资源数值分配空闲资源,其中,根据任务所需的资源数值对资源进行分片,建立资源分片与代理实例的关联关系,代理实例与资源实例一对一映射,可以对任务的资源需求进行动态计算、也可静态配置,从而根据需求对资源实例中的空闲资源进行选择。即,可以利用大任务的空闲资源,大小任务可以交叉执行。一方面可以提升小任务的响应时间,另一方面可以提升资源的利用效率。
图2示出根据本公开另一实施方式的弹性任务调度方法的流程图。除了包括图1所示的步骤S101至S105,图2还包括步骤S201。
在步骤S201中,在释放资源时,根据所要释放的资源的标识找到与所要释放的资源关联的代理实例,以将所要释放的资源恢复为空闲资源。
在弹性资源释放时,根据待释放资源的标识,通过已分配的资源与代理实例的关联关系找到代理实例,恢复代理实例的空闲资源。如果恢复后空闲度达到最大值,则意味着本代理实例映射的物理资源已经没有任务使用。因此,会发出释放请求,释放物理资源。即,可以保证资源的弹性。
图3示出根据本公开另一实施方式的弹性任务调度方法的流程图。除了包括图1所示的步骤S101至S105,图3还在步骤S101之前包括步骤S301。
在步骤S301中,对任务控制请求进行随机分发,以避免任务被集中于特定设备。
响应于用户或系统定时器提供的任务控制请求,根据当前系统环境,将任务控制请求再作一次随机的分发。因此,可以防止任务被过多的集中在一台机器上。例如:如果某台本地机器有个定时器会定期地生成一批任务,来处理某个业务,这时可以将这些任务分散到整个应用集群中。
图7示出根据本公开一实施方式的弹性任务调度方法的应用场景的示意图。图7的场景中,以spark平台为例来描述根据本公开实施例的弹性任务调度方法。
如图7所示,当用户发起启动实例时,任务控制服务模块负责响应用户和系统定时器提供的任务控制请求,根据当前系统环境,将任务控制请求再作一次随机的分发。
任务调度模块接到用户控制请求后,将目标任务进行加载并作初始化。初始化完成后放本地队列。独立的调度线程会检查队列中的任务,依据FIFO策略取出任务,读取该任务所需要资源数值,向弹性资源管理器申请资源。在申请资源时,需要在应用集群范围内,查找可用资源最小,但满足当前任务所需目标机器。如果找到,则向该机器申请指定数值的弹性资源。查找最小的原因是尽量使用已经存在spark资源实例,减少物理资源浪费。一旦资源申请成功,任务进入运行状态,并调用spark的任务状态查接口,通过定时轮询的方式检查作业完成状态。任务异常或正常完成后,释放弹性资源。
弹性资源管理模块负责资源实例(spark context)申请到的资源。在本地进行数值虚拟化,比如0~100的区间。当分配请求过来时,会先从本地资源池中,找到是否有空闲块。如果没有,则会向spark资源实例管理申请一个服务实例。并对此实例进行虚拟化,初始值空闲度为100。如果该模块发现有空闲资源,则根据请求的大小,对资源进行分片。并记录空闲数,已用数。并建立分片与代理实例进行关联关系。在弹性资源释放时,根据所属的id通过上述的关联关系找到代理实例,恢复空闲数。如果空闲度达到最大值,则意味着本实例代理的spark物理资源已经没有任务使用。因此,会向代理实例管理模块发出释放请求,关闭spark物理资源。Sparkderver shell主程序退出,释资源释放。
Spark资源实例管理模块是本地机器与spark集群交互的界面,它负责实际spark资源的申请及本地作业提交,是spark资源在本地的映射,代理服务在本地独立的进程中运行。代理实例与spark资源实例一一映射,并负责与远端Spark Driver通信。代理实例在启动时,通过Spark cluster模式,向spark集群申请物理资源并提交一个专门的drivershell程序。该driver shell程序在初始化环境后进入等待状态,直到实际的作业提交上来。Spark资源实例管理模块根据租户配置,对spark资源进行分组隔离。不同类型的任务,可以提交到对应的实例上。以达到根据业务属性进行资源隔离。还可以包括Spark日志管理模块,负责从spark derver端拉取业务程序打印出的日志到本地应用。通过一个定时器,在spark代理实例运行期间,周期性地提交一个日志同步作业。该作业会在driver里读取出指定大小的日志数据,并通过rpc方式返回,写到本地。每次拉取时,记录日志文件拉取的位置,接着从上一个位置读取。
图4示出根据本公开一实施方式的弹性任务调度装置的结构框图。如图4所示,弹性任务调度装置可以包括任务调度模块401、资源检索模块402和弹性资源管理模块403。
任务调度模块401被配置为响应于接收到的任务控制请求,将目标任务放入队列并检查队列中的任务;取出队列中的任务,读取任务所需的资源数值,并发出资源申请请求。
资源检索模块402被配置为响应于资源申请请求,在资源池中检索是否存在空闲资源。
弹性资源管理模块403被配置为当资源检索模块402检索出资源池中存在空闲资源时,根据资源申请请求中记载的任务所需的资源数值分配空闲资源,其中,根据任务所需的资源数值对资源进行分片,建立资源分片与代理实例的关联关系,代理实例与资源实例一对一映射。
在本公开的一个实施例中,资源可以是Spark资源。在本申请的实施例中,spark指的是一种大数据分布式内存计算平台。资源申请请求可以指的是向spark平台申请资源的请求。根据本公开的方案,为了获得更好的用户体验,可以让小任务与大任务共享spark资源实例(如:spark context)。由于spark平台的作业调度器本身是线程安全的,允许多线程任务提交。因此,可以在大任务空闲时,交叉执行小任务。一方面可以提升小任务的响应时间,另一方面可以提升资源的利用效率。
在本公开的一个实施例中,任务控制请求可以是由用户提交的,也可以是由系统定时器提交的。在本公开的一个实施例中,当希望利用诸如Spark资源之类的平台资源处理某个业务时,可能会有一批任务需要执行,因此,可能会由用户或系统定时器提交一批任务控制请求。在本公开的一个实施例中,可以根据任务控制请求,将任务控制请求所对应的目标任务放入队列,队列中可以排列有多个任务。其中,所述队列可以是本地队列。
在本公开的一个实施例中,资源数值指的是执行任务时所需的资源的量。在本公开的一个实施例中,对提交的作业资源需求和诸如spark资源的资源实例进行数值虚拟化后,可以确定资源数值。因此,可以读取任务所需的资源数值,并发出资源申请请求。
在本公开的一个实施例中,资源池指的是映射到本地主机上的平台的资源池,例如,spark平台的资源池。
在本公开的一个实施例中,针对任务所需的资源数值分配空闲资源是弹性的资源分配方式。弹性的资源分配方式指的是任务的资源需求可以动态计算、也可静态配置,根据需求从空闲的资源实例中选择合适的资源。
在本公开的一个实施例中,根据任务所需的资源数值对资源进行分片指的是资源已经数值化,资源分片对应于所需的资源数值,将所需的空闲资源的分片分配给任务,另外,记录资源的空闲数值以及已用数值。在本公开的一个实施例中,建立资源分片与代理实例的关联关系指的是需要建立资源分片与代理实例之间的关系,以便管理资源分片。
在本公开的一个实施例中,代理实例作为资源实例在本地的映射与资源实例之间存在一对一映射关系。
在本公开的一个实施例中,弹性资源管理模块403还被配置为:当资源检索模块402检索出资源池中不存在空闲资源时,获取一个代理实例,并对代理实例所关联的资源虚拟数值化,针对任务所需的资源数值分配空闲资源,其中,空闲资源属于代理实例所关联的资源,所述代理实例与资源实例一对一映射。即,在本地不存在具有空闲资源的代理实例,或者不存在具有足够空闲资源的代理实例的情况下,需要获取一个代理实例。对代理实例所关联的资源虚拟数值化可以使得根据任务所需的资源数值将资源适当地分配给对应的任务。例如,将代理实例中的资源在本地虚拟数值化,总数值为100,此时,代理实例的资源的初始空闲度为100。在一个例子中,当任务所需的资源数值是20时,可以将空闲度为100的代理实例的资源中的20份资源分配给任务。可以理解,代理实例的资源总数值为100仅仅是示例,总数值可以为任意值。
在本公开的一个实施例中,弹性资源管理模块403还被配置为:在资源池中检索空闲度最低且满足资源申请请求中记载的任务所需的资源数值的代理实例。例如,有两个代理实例,资源总数均为100,第一个代理实例的空闲数为50,第二个代理实例的空闲数为30。此时,当任务所需的资源数值为20时,将检索到的两个代理实例中的空闲度最低的第二个代理实例中的资源分配给该任务。在此情况下,可以最充分地利用代理实例中的空闲资源。也可以认为,此时是从空闲的资源实例中选择了最优的资源实例。
在本公开的一个实施例中,图4所示的装置还可以包括实际资源管理模块404。
实际资源管理模块404被配置为在针对任务所需的资源数值分配空闲资源后,响应于作业的提交向服务集群申请实际资源。即,代理实例是资源实例的本地映射,因此,在针对任务所需的资源数值分配空闲资源后,会需要向服务集群(例如,spark集群)进行作业提交,以申请实际资源。
在本公开的一个实施例中,实际资源管理模块404还被配置为根据租户配置,对实际资源进行分组隔离,其中,可以将不同类型的任务提交到对应的资源实例,以根据业务属性进行资源隔离。通过资源隔离,可以按业务需求,托管不同规模的资源实例。
在本公开实施方式中,通过任务调度模块,被配置为响应于接收到的任务控制请求,将目标任务放入队列并检查队列中的任务;取出队列中的任务,读取任务所需的资源数值,并发出资源申请请求;资源检索模块,被配置为响应于资源申请请求,在资源池中检索是否存在空闲资源;弹性资源管理模块,被配置为当资源检索模块检索出资源池中存在空闲资源时,根据资源申请请求中记载的任务所需的资源数值分配空闲资源,其中,根据任务所需的资源数值对资源进行分片,建立资源分片与代理实例的关联关系,代理实例与资源实例一对一映射,可以对任务的资源需求进行动态计算、也可静态配置,从而根据需求对资源实例中的空闲资源进行选择。即,可以利用大任务的空闲资源,大小任务可以交叉执行。一方面可以提升小任务的响应时间,另一方面可以提升资源的利用效率。
图5示出根据本公开另一实施方式的弹性任务调度装置的结构框图。除了包括如图4所示的任务调度模块401、资源检索模块402、弹性资源管理模块403和实际资源管理模块404之外,还可以包括资源释放模块501。
资源释放模块501被配置为在释放资源时,根据所要释放的资源的标识找到与所要释放的资源关联的代理实例,以将所要释放的资源恢复为空闲资源。
在弹性资源释放时,根据待释放资源的标识,通过已分配的资源与代理实例的关联关系找到代理实例,恢复代理实例的空闲资源。如果恢复后空闲度达到最大值,则意味着本代理实例映射的物理资源已经没有任务使用。因此,会发出释放请求,释放物理资源。即,可以保证资源的弹性。
图6示出根据本公开另一实施方式的弹性任务调度装置的结构框图。除了包括如图5所示的任务调度模块401、资源检索模块402、弹性资源管理模块403和实际资源管理模块404之外,还可以包括任务控制服务模块601。
任务控制服务模块601被配置为对任务控制请求进行随机分发,以避免任务被集中于特定设备。
响应于用户或系统定时器提供的任务控制请求,根据当前系统环境,将任务控制请求再作一次随机的分发。因此,可以防止任务被过多的集中在一台机器上。例如:如果某台本地机器有个定时器会定期地生成一批任务,来处理某个业务,这时可以将这些任务分散到整个应用集群中。
以上描述了弹性任务调度装置的内部功能和结构,在一个可能的设计中,该弹性任务调度系统的结构可实现为弹性任务调度设备,如图8中所示,该处理设备800可以包括处理器801以及存储器802。
所述存储器802用于存储支持弹性任务调度系统执行上述任一实施例中弹性任务调度方法的程序,所述处理器801被配置为用于执行所述存储器802中存储的程序。
所述存储器802用于存储一条或多条计算机指令,其中,所述一条或多条计算机指令被所述处理器801执行。
所述处理器801用于执行前述各方法步骤中的全部或部分步骤。
其中,所述弹性任务调度设备的结构中还可以包括通信接口,用于弹性任务调度设备与其他设备或通信网络通信。
本公开示例性实施例还提供了一种计算机存储介质,用于储存所述弹性任务调度系统所用的计算机软件指令,其包含用于执行上述任一实施例中弹性任务调度方法所涉及的程序。
图9是适于用来实现根据本公开一实施方式的弹性任务调度方法的计算机系统的结构示意图。
如图9所示,计算机系统900包括中央处理单元(CPU)901,其可以根据存储在只读存储器(ROM)902中的程序或者从存储部分908加载到随机访问存储器(RAM)903中的程序而执行上述图1所示的实施方式中的各种处理。在RAM903中,还存储有系统900操作所需的各种程序和数据。CPU901、ROM902以及RAM903通过总线904彼此相连。输入/输出(I/O)接口905也连接至总线904。
以下部件连接至I/O接口905:包括键盘、鼠标等的输入部分906;包括诸如阴极射线管(CRT)、液晶显示器(LCD)等以及扬声器等的输出部分907;包括硬盘等的存储部分908;以及包括诸如LAN卡、调制解调器等的网络接口卡的通信部分909。通信部分909经由诸如因特网的网络执行通信处理。驱动器910也根据需要连接至I/O接口905。可拆卸介质911,诸如磁盘、光盘、磁光盘、半导体存储器等等,根据需要安装在驱动器910上,以便于从其上读出的计算机程序根据需要被安装入存储部分908。
特别地,根据本公开的实施方式,上文参考图1描述的方法可以被实现为计算机软件程序。例如,本公开的实施方式包括一种计算机程序产品,其包括有形地包含在及其可读介质上的计算机程序,所述计算机程序包含用于执行图1的数据处理方法的程序代码。在这样的实施方式中,该计算机程序可以通过通信部分909从网络上被下载和安装,和/或从可拆卸介质911被安装。
附图中的流程图和框图,图示了按照本公开各种实施方式的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,路程图或框图中的每个方框可以代表一个模块、程序段或代码的一部分,所述模块、程序段或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个接连地表示的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的系统来实现,并且/或者可以用专用硬件与计算机指令的组合来实现。
描述于本公开实施方式中所涉及到的单元或模块可以通过软件的方式实现,也可以通过硬件的方式来实现。所描述的单元或模块也可以设置在处理器中,这些单元或模块的名称在某种情况下并不构成对该单元或模块本身的限定。
作为另一方面,本公开还提供了一种计算机可读存储介质,该计算机可读存储介质可以是上述实施方式中所述装置中所包含的计算机可读存储介质;也可以是单独存在,未装配入设备中的计算机可读存储介质。计算机可读存储介质存储有一个或者一个以上程序,所述程序被一个或者一个以上的处理器用来执行描述于本公开的方法。
以上描述仅为本公开的较佳实施例以及对所运用技术原理的说明。本领域技术人员应当理解,本公开中所涉及的发明范围,并不限于上述技术特征的特定组合而成的技术方案,同时也应涵盖在不脱离所述发明构思的情况下,由上述技术特征或其等同特征进行任意组合而形成的其它技术方案。例如上述特征与本公开中公开的(但不限于)具有类似功能的技术特征进行互相替换而形成的技术方案。