资源分配方法、装置、计算机设备和存储介质
技术领域
本发明涉及数据库技术领域,特别是涉及一种资源分配方法、装置、计算机设备和存储介质。
背景技术
随着数据库技术的发展,出现了联机分析处理(Online Analytical Processing,OLAP)技术。联机分析处理主要是采用分布式系统进行共享多维信息的、针对特定问题的联机数据访问和分析的快速软件技术。
对于联机分析处理查询,当前分布式系统一般采用先进先出(First Input FirstOutput)或者公平(FAIR)等调度算法来进行资源分配。然而,在联机分析处理查询中,有些查询对资源的消耗特别大,执行时间也特别长。如果同时有几个这样的查询请求并发执行,很容易就会把集群的资源占满。这样轻者会使得其它查询无法获得足够资源,阻碍这些查询请求的执行(即使这个查询请求占用的资源特别小,执行也特别快),影响用户体验;重者可能导致应用程序内存耗尽(Out Of Memory,OOM)或者整个集群崩溃。可见,传统的先进先出的资源分配方式或者公平的资源分配方式,在对资源消耗大的查询请求集中出现时,会影响系统的稳定性和总体性能。
发明内容
基于此,有必要针对上述技术问题,提供一种能够提升系统的稳定性和总体性能的资源分配方法、装置、计算机设备和存储介质。
一种资源分配方法,该方法包括:
接收当前查询请求,获取当前查询请求的预期资源消耗值;
根据预期资源消耗值,确定当前查询请求的当前资源消耗等级;
根据当前资源消耗等级,对当前查询请求进行资源分配。
在其中一个实施例中,上述的获取当前查询请求的预期资源消耗值,包括:
对当前查询请求进行解析,获得当前查询请求的执行计划树;
根据执行计划树,确定预期资源消耗值。
在其中一个实施例中,上述的根据执行计划树,确定预期资源消耗值,包括:
根据预设的表统计信息和预设的字段统计信息,确定执行计划树中各个节点的资源消耗值;
根据各节点的资源消耗值,确定预期资源消耗值。
在其中一个实施例中,上述的根据执行计划树,确定预期资源消耗值,包括:
根据预设的表统计信息、预设的字段统计信息以及执行计划树,确定目标数据表的查询行数和数据输入输出代价,目标数据表为在进行当前查询请求的查询时需要使用的各数据表;
根据预设的表统计信息、预设的字段统计信息以及执行计划树,确定当前查询请求的连接代价、连接后的行数、分组基数和中央处理器代价;
根据查询行数、数据输入输出代价、连接代价、连接后的行数、分组基数和中央处理器代价,确定预期资源消耗值。
在其中一个实施例中,上述的获取当前查询请求的预期资源消耗值,包括:
对当前查询请求进行解析,获得当前查询请求的执行计划树;
将执行计划树发送给代价分析服务器,获取代价分析服务器返回的预期资源消耗值,预期资源消耗根据执行计划树确定。
在其中一个实施例中,上述的根据当前资源消耗等级,对当前查询请求进行资源分配,包括:
根据当前资源消耗等级,确定当前查询请求的队列,其中,不同资源消耗等级的查询请求分配到不同队列上;
按照当前查询请求的队列的资源调度策略,对当前查询请求进行资源分配。
在其中一个实施例中,上述的方法还包括:
获取各队列的资源使用率,在当前队列的资源使用率低于预设的资源使用率阈值时,将当前队列的资源调整到各队列中的剩余队列;
或者
获取各队列的资源需求率,在当前队列的资源需求率高于预设的资源需求率阈值时,通过预设的资源动态扩容方案为当前队列增加资源。
在其中一个实施例中,上述的根据当前资源消耗等级,对当前查询请求进行资源分配,包括:
根据预设的资源消耗等级与集群的对应关系,将当前查询请求分配给当前资源消耗等级对应的集群,其中,各集群中分别采用公平调度的方式为分配到的查询请求分配资源。
在其中一个实施例中,上述的方法还包括:
获取各集群的资源使用率,在当前集群的资源使用率低于预设的资源使用率阈值时,将当前集群的资源调整到各集群中的剩余集群;
或者
获取各集群的资源需求率,在当前集群的资源需求率高于预设的资源需求率阈值时,通过预设的资源动态扩容方案为当前集群增加资源。
在其中一个实施例中,上述的方法还包括:
获取当前查询请求的执行日志;
根据执行日志,获取当前查询请求的实际资源消耗值、实际执行时长、调度时间和等待时间;
根据实际资源消耗值、实际执行时长、调度时间和等待时间,调整预期资源消耗值和资源消耗等级的对应关系,或者调整预期资源消耗值的计算方式。
一种资源分配装置,该装置包括:
消耗值确定模块,用于接收当前查询请求,获取当前查询请求的预期资源消耗值;
消耗等级确定模块,用于根据预期资源消耗值,确定当前查询请求的当前资源消耗等级;
资源分配模块,用于根据当前资源消耗等级,对当前查询请求进行资源分配。
一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,处理器执行计算机程序时实现以下步骤:
接收当前查询请求,获取当前查询请求的预期资源消耗值;
根据预期资源消耗值,确定当前查询请求的当前资源消耗等级;
根据当前资源消耗等级,对当前查询请求进行资源分配。
一种计算机可读存储介质,其上存储有计算机程序,计算机程序被处理器执行时实现以下步骤:
接收当前查询请求,获取当前查询请求的预期资源消耗值;
根据预期资源消耗值,确定当前查询请求的当前资源消耗等级;
根据当前资源消耗等级,对当前查询请求进行资源分配。
上述资源分配方法、装置、计算机设备和存储介质,接收当前查询请求,获取当前查询请求的预期资源消耗值,根据预期资源消耗值,确定当前查询请求的当前资源消耗等级,根据当前资源消耗等级,对当前查询请求进行资源分配。如此,实现了资源的隔离分配,采用该方案,使得资源消耗比较低的查询请求不会因为资源消耗比较高的查询请求而获取不到资源,而资源消耗比较高的查询请求在大多数情况下也是可以正常执行,能够在对资源消耗大的查询请求集中出现时,提升系统的稳定性和总体性能。
附图说明
图1为一个实施例中资源分配方法的应用环境图;
图2为一个实施例中资源分配方法的流程示意图;
图3为一个实施例中预期资源消耗值的获取步骤的流程示意图;
图4为另一个实施例中预期资源消耗值的获取步骤的流程示意图;
图5为一个实施例中预期资源消耗值的确定步骤的流程示意图;
图6为另一个实施例中预期资源消耗值的确定步骤的流程示意图;
图7为一个实施例中资源分配步骤的流程示意图;
图8为一个实施例中对应关系调整步骤或者计算方式调整步骤的流程示意图;
图9为一个实施例中的资源消耗分析模型的结构原理示意图;
图10为一个实施例中的资源分配方法的时序图;
图11为一个实施例中的查询分发的流程示意图;
图12为一个实施例中资源分配方法的结构框图;
图13为一个实施例中计算机设备的内部结构图。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
本发明提供的资源分配方法,可以应用于如图1所示的应用环境中。其中,终端102和服务器104通过网络进行通信,服务器104与集群106通过有线方式或者无线方式进行通信。其中,终端102可以但不限于是各种个人计算机、笔记本电脑、智能手机、平板电脑和便携式可穿戴设备,服务器104可以用独立的服务器或者是多个服务器组成的服务器集群来实现,集群106用于提供资源,其数量可以是一个或者多个,集群106一般包括多台计算机设备(机器)。本发明提供的资源分配方法中的资源可以指的是多集群中的某个集群,或者一个集群中的某台机器。本发明提供的资源分配方法一般应用于联机分析处理系统中。
在一个实施例中,如图2所示,提供了一种资源分配方法,以该方法应用于图1中的服务器为例进行说明,包括以下步骤:
步骤202,接收当前查询请求,获取当前查询请求的预期资源消耗值;
这里,当前查询请求一般是指联机分析处理查询,也可以是联机事务处理(on-line transaction processing,OLTP)请求等其他类型的联结查询请求。
这里,预期资源消耗值是指完成该当前查询请求对应的查询任务,预期所需消耗的资源值。
具体地,可以是服务器在获取到当前查询请求(例如,接收到终端发送的当前查询请求),对该当前查询请求进行解析分析,根据该解析分析的分析结果获得该当前查询请求的预期资源消耗值。也可以是服务器在获取到当前查询请求,从预处理服务器(例如,代价分析服务器)获取该该当前查询请求的预期资源消耗值,其中,预处理服务器用于对各种查询请求进行资源消耗值分析。
步骤204,根据预期资源消耗值,确定当前查询请求的当前资源消耗等级;
其中,资源消耗等级的数量以及与资源消耗值的对应关系,可以根据实际情况以及实际需要设定。例如,可以根据第一资源消耗门限值和第二资源消耗门限值,划分成高资源消耗级、中资源消耗级和低资源消耗三个资源消耗等级。其中,第一资源消耗门限值大于第二资源消耗门限值,在预期资源消耗值大于第一资源消耗门限值时,为高资源消耗级;在预期资源消耗值处于第一资源消耗门限值和第二资源消耗门限值之间时,为中资源消耗级;在预期资源消耗值小于第二资源消耗门限值时,为低资源消耗级。
步骤206,根据当前资源消耗等级,对当前查询请求进行资源分配。
具体地,根据当前资源消耗等级,将当前查询请求分配给当前资源消耗等级对应的资源集群或者队列,其中,不同资源消耗等级的查询请求被分配给不同的资源集群或者队列。
上述资源分配方法中,是接收当前查询请求,获取当前查询请求的预期资源消耗值,根据预期资源消耗值,确定当前查询请求的当前资源消耗等级,根据当前资源消耗等级,对当前查询请求进行资源分配,如此,可以实现资源的隔离分配。采用实施例的方案,使得资源消耗比较低的查询请求不会因为资源消耗比较高的查询请求而获取不到资源,而资源消耗比较高的查询请求在大多数情况下也是可以正常执行,能够在对资源消耗大的查询请求集中出现时,提升系统的稳定性和总体性能。
在其中一个实施例中,如图3所示,上述的获取当前查询请求的预期资源消耗值,可以包括如下步骤:
步骤302,对当前查询请求进行解析,获得当前查询请求的执行计划树;
这里,当前查询请求一般包括查询语句,例如,结构化查询语句,也即SQL(Structured Query Language,结构化查询语言)语句。
一般地,对于成熟的联机分析处理系统,都会使用基于代价的优化方式(Cost-Based Logical Optimizer,CBO)来对执行计划进行优化。基于代价的优化方式的主要目的也就是通过检测在查询中使用到的表和条件,来产生高效的执行路径,从而降低资源利用率,减少查询执行时间。一个查询语句可以解析成执行计划树,执行计划树上的每个节点代表查询中的一个操作,例如,扫描、投影或者过滤等。
步骤304,根据执行计划树,确定预期资源消耗值。
具体地,服务器可以首先对该执行计划树上的每个操作,分别计算每个操作的输入/输出(input/output,i/o)代价、中央处理器(Central Processing Unit,CPU)代价、存储(Memory)代价和联网(NETWORK)代价;接着,分别对每个操作的输入输出代价、中央处理器代价、存储代价和联网代价求和,得到每个操作的资源消耗值,最后,对各个操作的资源消耗值进行求和处理,得到当前查询请求的预期资源消耗值。
其中,输入/输出代价是指把数据从磁盘读入内存时所需代价(该代价是查询所需最主要的,所以在优化时一个基本原则就是降低输入/输出总次数);中央处理器代价是指处理内存中数据所需的代价,其中,数据一旦读入内存,当内存识别出所要的数据后,会在这些数据上执行排序操作(sort)或连接(join),这需要消耗中央处理器资源;存储代价是值对数据进行存储所需的代价,对于访问远程节点来说,联网代价的花费也是很大的。
本实施例中,通过解析当前查询请求获得执行计划树的方式,确定当前查询请求的预期资源消耗值,高效快捷。
在其中一个实施例中,如图4所示,上述的根据执行计划树,确定预期资源消耗值,可以包括如下步骤:
步骤402,根据预设的表统计信息和预设的字段统计信息,确定执行计划树中各个节点的资源消耗值;
这里,表统计信息可以包括表的行数,以字节统计的表的大小,表的分区大小和分区数目等表信息,但也不限于这些信息。
这里,字段统计信息可以包括字段的基数(count distinct)、字段的最大值、字段的最下值、内容为空的记录数(Null count)和字段平均长度等字段信息,但也不限于这些信息。
具体地,可以在进行资源消耗分析之前,预先对管理的每个表进行统计信息收集,收集的信息包括但不限于是上述提及的各种表统计信息和各种字段统计信息。在进行当前查询请求的资源消耗分析时,可以首先根据该当前查询请求的执行计划树确定在该当前查询请求中需要使用到的数据表,为了便于描述,以下将该数据表成为目标数据表,其次,从预设的表统计信息和预设的字段统计信息中,确定目标数据表的表统计信息和字段统计信息;最后,根据目标数据表的表统计信息和字段统计信息,计算执行计划树中各个节点的资源消耗值。这里,各个节点的资源消耗值也即至上述的各个操作的资源消耗值。
步骤404,根据各节点的资源消耗值,确定预期资源消耗值。
具体地,可以对各执行计划树中各个节点的资源消耗值进行求和处理,得到当前查询请求的预期资源消耗值。
本实施例中,预先采集了表统计信息和字段统计信息,且基于执行计划树确定当前查询请求的预期资源消耗值,可以提升预期资源消耗值的计算效率。
在其中一个实施例中,如图5所示,上述的根据执行计划树,确定预期资源消耗值,可以包括如下步骤:
步骤502,根据预设的表统计信息、预设的字段统计信息以及执行计划树,确定目标数据表的查询行数和数据输入输出代价,目标数据表为在进行当前查询请求的查询时需要使用的各数据表;
这里的表统计信息和字段统计信息可以参照上一个实施例中的描述,在此不予赘述。
具体地,可以基于代价的优化方式检查当前查询请求的查询中使用到的数据表和条件,该条件包括过滤条件。可以根据预设的表统计信息、预设的字段统计信息以及该过滤条件,确定在进行当前查询请求的查询时需要使用的各数据表的查询行数和数据输入输出代价。
步骤504,根据预设的表统计信息、预设的字段统计信息以及执行计划树,确定当前查询请求的连接代价、连接后的行数、分组基数和中央处理器代价;
具体他,可以根据在进行当前查询请求的查询时需要使用的连接(join)关系,计算连接代价和连接后的行数;可以根据执行计划树中的分组(group by)子句和维度的层级关系,以及预设的表统计信息和预设的字段统计信息,计算汇聚后的基数(carndinality),也即分组基数;可以根据执行计划树中汇总函数和是否排序等信息确定中央处理器代价。
步骤506,根据查询行数、数据输入输出代价、连接代价、连接后的行数、分组基数和中央处理器代价,确定预期资源消耗值;
具体地,可以对查询行数、数据输入输出代价、连接代价、连接后的行数、分组基数和中央处理器代价进行汇总分析,得到当前查询请求的预期资源消耗值。
上述两个实施例,一种是基于执行计划树中的节点进行资源消耗统计,一种是基于各种类型代价进行资源消耗统计,根据需要,可以选择其中任何一种方式进行预期资源消耗值的计算,也可以通过将这两种方式有机结合的方式进行预期资源消耗值的计算。
本实施例中,预先采集了表统计信息和字段统计信息,且基于执行计划树确定当前查询请求的预期资源消耗值,可以提升预期资源消耗值的计算效率。
在其中一个实施例中,如图6所示,上述的根据执行计划树,确定预期资源消耗值,可以包括如下步骤:
步骤602,对当前查询请求进行解析,获得当前查询请求的执行计划树;
该步骤602可以参照上述步骤302的描述,在此不予赘述。
步骤604,将执行计划树发送给代价分析服务器,获取代价分析服务器返回的预期资源消耗值,预期资源消耗根据执行计划树确定;
其中,代价分析服务器确定预期资源消耗值的方式,可以采用上述两个实施例中的根据执行计划树,确定预期资源消耗值的方式。
本实施例中,通过解析当前查询请求获得执行计划树的方式,并将执行计划树发送给代价分析服务器进行预期资源消耗值的计算,这种方式,在查询请求高并发时,可以提升预期资源消耗的获取效率。
在其中一个实施例中,如图7,上述的根据当前资源消耗等级,对当前查询请求进行资源分配,可以包括如下步骤:
步骤702,根据当前资源消耗等级,确定当前查询请求的队列,其中,不同资源消耗等级的查询请求分配到不同队列上;
一般地,不同资源消耗等级的查询请求放到不同的队列上,不同资源消耗等级队列的容量也不一样,这里,容量是指等待调度执行的查询请求的数目(或者最大数目)。例如,对于包括高资源消耗等级、中资源消耗等级和低资源消耗等级的情况,低资源消耗等级队列容量最大,高资源消耗等级的容量最小。
步骤704,按照当前查询请求的队列的资源调度策略,对当前查询请求进行资源分配。
其中,每个队列上都配置有调度进程,对队列中的查询请求进行调度,不同队列的调度进程有不同的调度策略,例如,高资源消耗等级的队列的调度策略最多只允许同时调度一个查询请求。一般地,资源消耗等级越高(即每个查询请求的平均资源消耗值越高)的队列,同一时段允许调度的查询请求的数量越少,即同一时段允许调度的查询请求的数量与资源消耗等级负相关。
本实施例的方案,查询请求根据资源消耗等级放到不同的队列中,当队列满了以后,后续的查询请求一般设置为被抛弃掉。采用本实施例的方案,对资源消耗比较低的查询请求能够保证总是可以获得很充足的资源,不会因为有资源消耗比较高的查询请求获取不到资源。且资源消耗比较高的查询请求在大多数情况下也是可以正常执行,可以保障整个系统平稳有序的运行。
在其中一个实施例中,本申请的资源分配方法,还可以包括步骤:获取各队列的资源使用率,在当前队列的资源使用率低于预设的资源使用率阈值时,将当前队列的资源调整到各所述队列中的剩余队列。
这里,当前队列可以是任意一队列。这里,将当前队列的资源调整到各所述队列中的剩余队列,可以是将当前队列的部分资源调整到各所述队列中的剩余队列中的一个或者多个多列中去。
具体地,在当前队列在指定时间内的资源使用率低于预设的资源使用率阈值时,通过预设的资源动态调整策略,将该队列中的一部分资源调整到资源使用率较高的队列上。这里,资源动态调整策略可以根据实际需要设定,资源动态调整策略具体可以包括调整时段、资源调整比率以及向几个队列调整等信息。
采用本实施例的方案,可以实现资源动态调整,进一步提升系统的稳定性和总体性能。
在其中一个实施例中,本发明的资源分配方法,还可以包括步骤:获取各所述队列的资源需求率,在当前队列的资源需求率高于预设的资源需求率阈值时,通过预设的资源动态扩容方案为当前队列增加资源。
这里,当前队列可以是任意一队列。这里,资源需求率等于资源需求值与资源实际值的比值。
具体地,可以在当前队列的资源需求率高于预设的资源需求率阈值时,判定该当前队列的资源处于紧张状态,通过预设的资源动态扩容方案为当前队列增加资源,如此,可以缓解当前队列的资源紧张状况。其中,资源动态扩容方案具体可以包括增容时段以及所需增加的资源值等信息。
采用本实施例的方案,可以实现资源动态扩容,进一步提升系统的稳定性和总体性能。
在其中一个实施例中,上述的根据当前资源消耗等级,对当前查询请求进行资源分配,可以包括如下步骤:根据预设的资源消耗等级与集群的对应关系,将当前查询请求分配给当前资源消耗等级对应的集群,其中,各集群中分别采用公平调度的方式为分配到的查询请求分配资源。
具体地,各集群(节点)被预先设置不同的等级标签,例如高、中、低。不同等级的资源集群执行不同等级的查询请求。服务器根据预设的资源消耗等级与集群的对应关系,将当前查询请求分配给当前资源消耗等级对应的集群,由该集群进行当前查询请求的执行,即执行当前查询请求的查询任务。
本实施例的方案中,不同等级的资源集群执行不同等级的查询请求,对资源消耗比较低的查询请求能够保证总是可以获得很充足的资源,不会因为有资源消耗比较高的查询请求获取不到资源,且资源消耗比较高的查询请求在大多数情况下也是可以正常执行,可以保障整个系统平稳有序的运行。
在其中一个实施例中,本发明的资源分配方法,还可以包括步骤:获取各集群的资源使用率,在当前集群的资源使用率低于预设的资源使用率阈值时,将当前集群的资源调整到各所述集群中的剩余集群。
这里,当前集群可以是任意一集群。这里,将当前集群的资源调整到各所述集群中的剩余集群,可以是将当前集群的部分资源调整到各所述集群中的剩余集群中的一个或者多个多列中去。
具体地,在当前集群在指定时间内的资源使用率低于预设的资源使用率阈值时,通过预设的资源动态调整策略,将该集群中的一部分资源调整到资源使用率较高的集群上。这里,资源动态调整策略可以根据实际需要设定,资源动态调整策略具体可以包括调整时段、资源调整比率以及向几个集群调整等信息。
采用本实施例的方案,可以实现资源动态调整,进一步提升系统的稳定性和总体性能。
在其中一个实施例中,本发明的资源分配方法,还可以包括步骤:获取各所述集群的资源需求率,在当前集群的资源需求率高于预设的资源需求率阈值时,通过预设的资源动态扩容方案为当前集群增加资源。
这里,当前集群可以是任意一集群。这里,资源需求率等于资源需求值与资源实际值的比值。
具体地,可以在当前集群的资源需求率高于预设的资源需求率阈值时,判定该当前集群的资源处于紧张状态,通过预设的资源动态扩容方案为当前集群增加资源,如此,可以缓解当前集群的资源紧张状况。其中,资源动态扩容方案具体可以包括增容时段以及所需增加的资源值等信息。
采用本实施例的方案,可以实现资源动态扩容,进一步提升系统的稳定性和总体性能。
在其中一个实施例中,本发明的资源分配方法,如图8所示,还可以包括步骤:
步骤802,获取当前查询请求的执行日志;
具体地,可以通过系统记录日志当前查询请求的执行日志,该执行日志指实际执行当前查询请求所产生的日志。
步骤804,根据执行日志,获取当前查询请求的实际资源消耗值、实际执行时长、调度时间和等待时间;
步骤806,根据实际资源消耗值、实际执行时长、调度时间和等待时间,调整预期资源消耗值和资源消耗等级的对应关系,或者调整预期资源消耗值的计算方式。
具体地,可以采用机器学习或者人工智能等算法,对预期资源消耗值和资源消耗等级的对应关系,以及预期资源消耗值的计算方式进行不断地学习和调整,以提升准确度,减少误杀或者误判情况。
为了便于理解本发明的方案,以下通过具体示例进行说明。
联机分析处理引擎(例如如上实施例中的服务器)主要使用数据查询系统(druid)作为汇总统计数据的存储,可以尽可能会将查询下压到数据查询系统中来执行,减少编程语言(spark)本身的开销。数据查询系统的消耗分析模型(cost模型)可以参考图9。
在进行查询请求(SQL语句)调度和命令分发前,可以调用cost模型对查询请求的预期资源消耗值进行分析。如果发现该条查询请求的预期资源消耗值超过阈值,可以对其进行特殊化处理,从而达到资源隔离以及服务降级的作用,对整个联机分析处理引擎起到保护作用。
存储也要有资源隔离和流量管控,现在主要是对汇总性存储的资源进行管控。
对于数据查询系统:
历史节点区分不同的组(tier),高优先级的组的资源较多,低优先级组的资源较少,一个数据源(datasource)要分配到不同的组中,高优先级的副本数较多,低优先级的副本数据较少
代理(Broker)也要划分不同优先级。不同优先级代理资源数也不相同,并且要路由到不同的组中。
对于关系型数据库(例如postgresql);
postgresql采用citus的分布式集群方案,管理节点(master节点)和处理节点(worker节点)没有优先级的概念,但是我们可以人为的对管理节点进行区分:分为高优先级的管理节点和低优先级的管理节点。各个级别的管理节点的资源数也是不同的。不同优先级管理节点处理不同级别的查询请求。
联机分析处理引擎的管理(master)层需要感知数据查询系统集群和逻辑结构集群中的管理节点的优先级别,在创建和管理管理节点集群时,需要将管理节点信息传递给管理节点集群,管理节点只对自己管理下的资源进行操作。不同的管理节点集群管理不同级别,但是同一优先级别可以由多个管理节点集群管理。
关于资源分级:
这里的资源指的是多集群中的某个集群,或者一个集群中的某台机器。通过对特定资源进行分级,使得指定资源只处理某些特定的查询请求。资源分级可以通过打标签来实现。
例如,一个联机分析处理引擎由三个集群组成
高速:要求查询能在1s内返回。(预期资源消耗值(cost)在100以下);
中速:要求查询能在1-5s内返回(预期资源消耗值在100-500之间);
慢速:查询性能在5s外返回(预期资源消耗值在在500以上)。
当然,分级方式并不限于该举例中的方式。
关于预期资源消耗值的计算:
各查询请求都会经过路由组件(route组件)。路由组件会对查询请求进行预期资源消耗值的计算,算出各查询请求的预期资源消耗值。
关于查询请求分发,参见图10:
路由组件会根据预期资源消耗值的配置值和集群的标签,将查询请求发到合适的集群中。例如,对于大区的汇总查询,预期资源消耗值的计算值为50,则转发到高速集群中;而计算商品销售排行前十的查询请求,则资源代价很大,例如,预期资源消耗值为1000,则转发到慢速集群中。
关于资源动态调整:
当某一集群(队列)中在指定时间内资源使用率在一定阈值下,可以通过资源动态调整策略,将一部分资源调整到资源使用率较高的集群(队列)上。
关于资源动态扩容:
当某一集群(队列)中的资源在一定时间内处于紧张状态,可以通过资源动态扩容方案,增加资源,缓解资源紧张状况。
应该理解的是,虽然图2-8的流程图中的各个步骤按照箭头的指示依次显示,但是这些步骤并不是必然按照箭头指示的顺序依次执行。除非本文中有明确的说明,这些步骤的执行并没有严格的顺序限制,这些步骤可以以其它的顺序执行。而且,图2-8中的至少一部分步骤可以包括多个子步骤或者多个阶段,这些子步骤或者阶段并不必然是在同一时刻执行完成,而是可以在不同的时刻执行,这些子步骤或者阶段的执行顺序也不必然是依次进行,而是可以与其它步骤或者其它步骤的子步骤或者阶段的至少一部分轮流或者交替地执行。
在一个实施例中,如图12所示,提供了一种资源分配装置,包括:消耗值确定模块1202、消耗等级确定模块1204和资源分配模块1206,其中:
消耗值确定模块1202,用于接收当前查询请求,获取当前查询请求的预期资源消耗值;
消耗等级确定模块1204,用于根据预期资源消耗值,确定当前查询请求的当前资源消耗等级;
资源分配模块1206,用于根据当前资源消耗等级,对当前查询请求进行资源分配。
在其中一个实施例中,消耗值确定模块1202可以对当前查询请求进行解析,获得当前查询请求的执行计划树,根据执行计划树,确定预期资源消耗值。
在其中一个实施例中,消耗值确定模块1202可以根据预设的表统计信息和预设的字段统计信息,确定执行计划树中各个节点的资源消耗值,根据各节点的资源消耗值,确定预期资源消耗值。
在其中一个实施例中,消耗值确定模块1202可以根据预设的表统计信息、预设的字段统计信息以及执行计划树,确定目标数据表的查询行数和数据输入输出代价,目标数据表为在进行当前查询请求的查询时需要使用的各数据表,根据预设的表统计信息、预设的字段统计信息以及执行计划树,确定当前查询请求的连接代价、连接后的行数、分组基数和中央处理器代价,根据查询行数、数据输入输出代价、连接代价、连接后的行数、分组基数和中央处理器代价,确定预期资源消耗值。
在其中一个实施例中,消耗值确定模块1202可以对当前查询请求进行解析,获得当前查询请求的执行计划树,将执行计划树发送给代价分析服务器,获取代价分析服务器返回的预期资源消耗值,预期资源消耗根据执行计划树确定。
在其中一个实施例中,资源分配模块1206可以根据当前资源消耗等级,确定当前查询请求的队列,其中,不同资源消耗等级的查询请求分配到不同队列上,按照当前查询请求的队列的资源调度策略,对当前查询请求进行资源分配。
在其中一个实施例中,上述的装置还可以包括第一资源调整模块或者第一资源扩容模块:
第一资源调整模块,用于获取各队列的资源使用率,在当前队列的资源使用率低于预设的资源使用率阈值时,将当前队列的资源调整到各队列中的剩余队列;
第一资源扩容模块,用于获取各队列的资源需求率,在当前队列的资源需求率高于预设的资源需求率阈值时,通过预设的资源动态扩容方案为当前队列增加资源。
在其中一个实施例中,资源分配模块1206可以根据预设的资源消耗等级与集群的对应关系,将当前查询请求分配给当前资源消耗等级对应的集群,其中,各集群中分别采用公平调度的方式为分配到的查询请求分配资源。
在其中一个实施例中,上述的装置还可以包括第二资源调整模块或者第二资源扩容模块:
第二资源调整模块,用于获取各集群的资源使用率,在当前集群的资源使用率低于预设的资源使用率阈值时,将当前集群的资源调整到各集群中的剩余集群;
第二资源扩容模块,用于获取各集群的资源需求率,在当前集群的资源需求率高于预设的资源需求率阈值时,通过预设的资源动态扩容方案为当前集群增加资源。
在其中一个实施例中,上述的装置还可以动态调整模块,该动态调整模块用于获取当前查询请求的执行日志,根据执行日志,获取当前查询请求的实际资源消耗值、实际执行时长、调度时间和等待时间,根据实际资源消耗值、实际执行时长、调度时间和等待时间,调整预期资源消耗值和资源消耗等级的对应关系,或者调整预期资源消耗值的计算方式。
关于资源分配装置的具体限定可以参见上文中对于资源分配方法的限定,在此不再赘述。上述资源分配装置中的各个模块可全部或部分通过软件、硬件及其组合来实现。上述各模块可以硬件形式内嵌于或独立于计算机设备中的处理器中,也可以以软件形式存储于计算机设备中的存储器中,以便于处理器调用执行以上各个模块对应的操作。
在一个实施例中,提供了一种计算机设备,该计算机设备可以是服务器,其内部结构图可以如图13所示。该计算机设备包括通过系统总线连接的处理器、存储器和网络接口。其中,该计算机设备的处理器用于提供计算和控制能力。该计算机设备的存储器包括非易失性存储介质、内存储器。该非易失性存储介质存储有操作系统、计算机程序和数据库。该内存储器为非易失性存储介质中的操作系统和计算机程序的运行提供环境。该计算机设备的网络接口用于与外部的终端通过网络连接通信。该计算机程序被处理器执行时以实现一种资源分配方法。
本领域技术人员可以理解,图13中示出的结构,仅仅是与本发明方案相关的部分结构的框图,并不构成对本发明方案所应用于其上的计算机设备的限定,具体的计算机设备可以包括比图中所示更多或更少的部件,或者组合某些部件,或者具有不同的部件布置。
在一个实施例中,提供了一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,处理器执行计算机程序时实现以下步骤:
接收当前查询请求,获取当前查询请求的预期资源消耗值;
根据预期资源消耗值,确定当前查询请求的当前资源消耗等级;
根据当前资源消耗等级,对当前查询请求进行资源分配。
在其中一个实施例中,在处理器执行计算机程序实现上述的获取当前查询请求的预期资源消耗值的步骤时,具体实现以下步骤:对当前查询请求进行解析,获得当前查询请求的执行计划树;根据执行计划树,确定预期资源消耗值。
在其中一个实施例中,在处理器执行计算机程序实现上述的根据执行计划树,确定预期资源消耗值的步骤时,具体实现以下步骤:根据预设的表统计信息和预设的字段统计信息,确定执行计划树中各个节点的资源消耗值;根据各节点的资源消耗值,确定预期资源消耗值。
在其中一个实施例中,在处理器执行计算机程序实现上述的根据执行计划树,确定预期资源消耗值的步骤时,具体实现以下步骤:根据预设的表统计信息、预设的字段统计信息以及执行计划树,确定目标数据表的查询行数和数据输入输出代价,目标数据表为在进行当前查询请求的查询时需要使用的各数据表;根据预设的表统计信息、预设的字段统计信息以及执行计划树,确定当前查询请求的连接代价、连接后的行数、分组基数和中央处理器代价;根据查询行数、数据输入输出代价、连接代价、连接后的行数、分组基数和中央处理器代价,确定预期资源消耗值。
在其中一个实施例中,在处理器执行计算机程序实现上述的获取当前查询请求的预期资源消耗值的步骤时,具体实现以下步骤:对当前查询请求进行解析,获得当前查询请求的执行计划树;将执行计划树发送给代价分析服务器,获取代价分析服务器返回的预期资源消耗值,预期资源消耗根据执行计划树确定。
在其中一个实施例中,在处理器执行计算机程序实现上述的根据当前资源消耗等级,对当前查询请求进行资源分配的步骤时,具体实现以下步骤:根据当前资源消耗等级,确定当前查询请求的队列,其中,不同资源消耗等级的查询请求分配到不同队列上;按照当前查询请求的队列的资源调度策略,对当前查询请求进行资源分配。
在一个实施例中,处理器执行计算机程序时还实现以下步骤:
获取各队列的资源使用率,在当前队列的资源使用率低于预设的资源使用率阈值时,将当前队列的资源调整到各队列中的剩余队列;
或者
获取各队列的资源需求率,在当前队列的资源需求率高于预设的资源需求率阈值时,通过预设的资源动态扩容方案为当前队列增加资源。
在其中一个实施例中,在处理器执行计算机程序实现上述的根据当前资源消耗等级,对当前查询请求进行资源分配的步骤时,具体实现以下步骤:根据预设的资源消耗等级与集群的对应关系,将当前查询请求分配给当前资源消耗等级对应的集群,其中,各集群中分别采用公平调度的方式为分配到的查询请求分配资源。
在一个实施例中,处理器执行计算机程序时还实现以下步骤:
获取各集群的资源使用率,在当前集群的资源使用率低于预设的资源使用率阈值时,将当前集群的资源调整到各集群中的剩余集群;
或者
获取各集群的资源需求率,在当前集群的资源需求率高于预设的资源需求率阈值时,通过预设的资源动态扩容方案为当前集群增加资源。
在一个实施例中,处理器执行计算机程序时还实现以下步骤:获取当前查询请求的执行日志;根据执行日志,获取当前查询请求的实际资源消耗值、实际执行时长、调度时间和等待时间;根据实际资源消耗值、实际执行时长、调度时间和等待时间,调整预期资源消耗值和资源消耗等级的对应关系,或者调整预期资源消耗值的计算方式。
在一个实施例中,提供了一种计算机可读存储介质,其上存储有计算机程序,计算机程序被处理器执行时实现以下步骤:
接收当前查询请求,获取当前查询请求的预期资源消耗值;
根据预期资源消耗值,确定当前查询请求的当前资源消耗等级;
根据当前资源消耗等级,对当前查询请求进行资源分配。
在其中一个实施例中,在计算机程序被处理器执行实现上述的获取当前查询请求的预期资源消耗值的步骤时,具体实现以下步骤:对当前查询请求进行解析,获得当前查询请求的执行计划树;根据执行计划树,确定预期资源消耗值。
在其中一个实施例中,在计算机程序被处理器执行实现上述的根据执行计划树,确定预期资源消耗值的步骤时,具体实现以下步骤:根据预设的表统计信息和预设的字段统计信息,确定执行计划树中各个节点的资源消耗值;根据各节点的资源消耗值,确定预期资源消耗值。
在其中一个实施例中,在计算机程序被处理器执行实现上述的根据执行计划树,确定预期资源消耗值的步骤时,具体实现以下步骤:根据预设的表统计信息、预设的字段统计信息以及执行计划树,确定目标数据表的查询行数和数据输入输出代价,目标数据表为在进行当前查询请求的查询时需要使用的各数据表;根据预设的表统计信息、预设的字段统计信息以及执行计划树,确定当前查询请求的连接代价、连接后的行数、分组基数和中央处理器代价;根据查询行数、数据输入输出代价、连接代价、连接后的行数、分组基数和中央处理器代价,确定预期资源消耗值。
在其中一个实施例中,在计算机程序被处理器执行实现上述的获取当前查询请求的预期资源消耗值的步骤时,具体实现以下步骤:对当前查询请求进行解析,获得当前查询请求的执行计划树;将执行计划树发送给代价分析服务器,获取代价分析服务器返回的预期资源消耗值,预期资源消耗根据执行计划树确定。
在其中一个实施例中,在计算机程序被处理器执行实现上述的根据当前资源消耗等级,对当前查询请求进行资源分配的步骤时,具体实现以下步骤:根据当前资源消耗等级,确定当前查询请求的队列,其中,不同资源消耗等级的查询请求分配到不同队列上;按照当前查询请求的队列的资源调度策略,对当前查询请求进行资源分配。
在一个实施例中,计算机程序被处理器执行时还实现以下步骤:
获取各队列的资源使用率,在当前队列的资源使用率低于预设的资源使用率阈值时,将当前队列的资源调整到各队列中的剩余队列;
或者
获取各队列的资源需求率,在当前队列的资源需求率高于预设的资源需求率阈值时,通过预设的资源动态扩容方案为当前队列增加资源。
在其中一个实施例中,在计算机程序被处理器执行实现上述的根据当前资源消耗等级,对当前查询请求进行资源分配的步骤时,具体实现以下步骤:根据预设的资源消耗等级与集群的对应关系,将当前查询请求分配给当前资源消耗等级对应的集群,其中,各集群中分别采用公平调度的方式为分配到的查询请求分配资源。
在一个实施例中,计算机程序被处理器执行时还实现以下步骤:
获取各集群的资源使用率,在当前集群的资源使用率低于预设的资源使用率阈值时,将当前集群的资源调整到各集群中的剩余集群;
或者
获取各集群的资源需求率,在当前集群的资源需求率高于预设的资源需求率阈值时,通过预设的资源动态扩容方案为当前集群增加资源。
在一个实施例中,计算机程序被处理器执行时还实现以下步骤:获取当前查询请求的执行日志;根据执行日志,获取当前查询请求的实际资源消耗值、实际执行时长、调度时间和等待时间;根据实际资源消耗值、实际执行时长、调度时间和等待时间,调整预期资源消耗值和资源消耗等级的对应关系,或者调整预期资源消耗值的计算方式。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的计算机程序可存储于一非易失性计算机可读取存储介质中,该计算机程序在执行时,可包括如上述各方法的实施例的流程。其中,本发明所提供的各实施例中所使用的对存储器、存储、数据库或其它介质的任何引用,均可包括非易失性和/或易失性存储器。非易失性存储器可包括只读存储器(ROM)、可编程ROM(PROM)、电可编程ROM(EPROM)、电可擦除可编程ROM(EEPROM)或闪存。易失性存储器可包括随机存取存储器(RAM)或者外部高速缓冲存储器。作为说明而非局限,RAM以多种形式可得,诸如静态RAM(SRAM)、动态RAM(DRAM)、同步DRAM(SDRAM)、双数据率SDRAM(DDRSDRAM)、增强型SDRAM(ESDRAM)、同步链路(Synchlink)DRAM(SLDRAM)、存储器总线(Rambus)直接RAM(RDRAM)、直接存储器总线动态RAM(DRDRAM)、以及存储器总线动态RAM(RDRAM)等。
以上实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。
以上所述实施例仅表达了本发明的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变形和改进,这些都属于本发明的保护范围。因此,本发明专利的保护范围应以所附权利要求为准。