一种计算引擎从分布式数据库加载数据的方法及装置

文档序号:29812459发布日期:2022-04-27 08:27阅读:164来源:国知局
一种计算引擎从分布式数据库加载数据的方法及装置

1.本说明书一个或多个实施例涉及分布式计算领域和分布式数据库领域,尤其涉及一种计算引擎从分布式数据库加载数据的方法及装置。


背景技术:

2.随着技术的发展,数据收集和运用的规模不断增长,传统的单机关系型数据库越来越不能处理与日俱增的大规模数据。由此,涌现出处理大规模数据的分布式数据库。然而,分布式数据库主要擅长于处理事务型负载。当应用场景中需要执行分析型负载时,分布式数据库可以处理的负载有限。例如,分布式数据库常常不擅长处理流计算、机器学习、图计算等负载。所以,当数据存储在分布式数据库中,且用户需要使用这些数据来执行分析型负载时,常见的解决方案是将数据从分布式数据库加载到分布式计算引擎,借助计算引擎来执行各种分析型计算。但是,在这种情况下,尤其是在加载数据量较大的情况下,数据从分布式数据库加载到计算引擎消耗的时间可能成为整个计算任务的性能瓶颈。


技术实现要素:

3.本说明书中的实施例旨在提供一种新的计算引擎从分布式数据库加载数据的方法。该方法根据表数据的分区,建立在分布式数据库的存储节点上并行执行的加载任务,并将各个存储节点上的表分区优先分配给本地执行的加载任务,然后在各个节点上并行执行其本地加载任务。利用该方法,可以保证各个数据加载任务的加载的数据量的均衡,可以有效减少了跨节点分布式访问的开销、以及节点内非连续性访问的开销,进而提高数据加载的效率。
4.根据第一方面,提供了一种计算引擎从分布式数据库加载数据的方法,所述分布式数据库包括多个存储节点,所述方法包括:
5.获取分布式数据库中第一数据表的分区信息,其中,所述分区信息包括第一数据表的各个分区所在的存储节点的标识;
6.根据所述分区信息执行分区调度,生成针对若干存储节点的若干加载任务;所述分区调度优先将所述各个分区分配给所在的存储节点对应的加载任务;
7.将所述若干加载任务分别分配给所述若干存储节点中的任务执行器,使其并行执行所述若干加载任务。
8.在一种可能的实施方式中,所述计算引擎为spark计算引擎,所述分布式数据库为oceanbase数据库。
9.在一种可能的实施方式中,所述存储节点的标识为存储节点的ip地址。
10.在一种可能的实施方式中,所述存储节点基于物理节点、虚拟机节点或容器节点中的一种或多种。
11.在一种可能的实施方式中,所述存储节点具有对应的分配上限阈值;
12.所述分区调度优先将所述各个分区分配给所在的存储节点对应的加载任务,包
括:
13.对于任意存储节点,
14.若其本地分区的数量不超过所述分配上限阈值,将其全部本地分区分配给该存储节点对应的加载任务。
15.在一种可能的实施方式中,所述分配上限阈值为所述存储节点的处理器内核数量。
16.在一种可能的实施方式中,所述分区调度优先将所述各个分区分配给所在的存储节点对应的加载任务,包括:
17.若其本地分区的数量超过所述分配上限阈值,将其中所述分配上限阈值数量的本地分区分配给该存储节点对应的加载任务;
18.将其余的本地分区分配给其他存储节点的加载任务。
19.在一种可能的实施方式中,所述方法还包括:
20.在获取分布式数据库中第一数据表的分区信息之前,
21.获取客户端提交的应用代码,所述应用代码包括针对第一数据表的加载指示。
22.根据第二方面,提供了一种计算引擎从分布式数据库加载数据的装置,所述分布式数据库包括多个存储节点,所述装置包括:
23.分区信息获取单元,配置为,获取分布式数据库中第一数据表的分区信息,其中,所述分区信息包括第一数据表的各个分区所在的存储节点的标识;
24.任务确定单元,配置为,根据所述分区信息执行分区调度,生成针对若干存储节点的若干加载任务;所述分区调度优先将所述各个分区分配给所在的存储节点对应的加载任务;
25.任务分配单元,配置为,将所述若干加载任务分别分配给所述若干存储节点中的任务执行器,使其并行执行所述若干加载任务。
26.在一种可能的实施方式中,所述计算引擎为spark计算引擎,所述分布式数据库为oceanbase数据库。
27.在一种可能的实施方式中,所述存储节点的标识为存储节点的ip地址。
28.在一种可能的实施方式中,所述存储节点基于物理节点、虚拟机节点或容器节点中的一种或多种。
29.在一种可能的实施方式中,所述存储节点具有对应的分配上限阈值;
30.任务确定单元,进一步配置为:
31.对于任意存储节点,
32.若其本地分区的数量不超过所述分配上限阈值,将其全部本地分区分配给该存储节点对应的加载任务。
33.在一种可能的实施方式中,所述分配上限阈值为所述存储节点的处理器内核数量。
34.在一种可能的实施方式中,任务确定单元,进一步配置为:
35.若其本地分区的数量超过所述分配上限阈值,将其中所述分配上限阈值数量的本地分区分配给该存储节点对应的加载任务;
36.将其余的本地分区分配给其他存储节点的加载任务。
37.在一种可能的实施方式中,所述装置还包括,表加载指示获取单元,配置为:
38.在获取分布式数据库中第一数据表的分区信息之前,
39.获取客户端提交的应用代码,所述应用代码中包括针对第一数据表的加载指示。
40.根据第三方面,提供一种计算机可读存储介质,其上存储有计算机程序,当所述计算机程序在计算机中执行时,令计算机执行第一方面所述的方法。
41.根据第四方面,提供一种计算设备,包括存储器和处理器,所述存储器中存储有可执行代码,所述处理器执行所述可执行代码时,实现第一方面所述的方法。
42.利用以上各个方面中的方法、装置、存储介质和计算设备中的一个或多个,可以保证各个加载任务的数据加载量的均衡,有效减少了跨节点分布式访问的开销、以及节点内非连续性访问的开销,提高计算引擎数据加载的效率。
附图说明
43.为了更清楚说明本发明实施例的技术方案,下面将对实施例描述中所需使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
44.图1示出根据本说明书实施例的一种计算引擎从分布式数据库加载数据的方法的原理示意图;
45.图2示出根据本说明书实施例的一种计算引擎从分布式数据库加载数据的方法的时序流程图;
46.图3示出通过常规轮询调度按分区加载表数据的原理示意图;
47.图4示出根据本说明书实施例的一种计算引擎从分布式数据库加载数据的装置的结构图。
具体实施方式
48.下面将结合附图,对本发明书提供的方案进行描述。
49.如前所述,随着数据运用规模的不断增长,传统的单机关系型数据库越来越不能处理与日俱增的大规模数据。由此涌现出了处理大规模数据的分布式数据库,例如oceanbase。然而,分布式数据库主要擅长处理事务型负载。当企业需要用关系型数据库来执行分析型负载时,分布式数据库可以处理的负载有限。例如,分布式数据库不擅长处理流计算,机器学习,图计算等负载。因此,当数据存储在分布式数据库中,用户需要使用这些数据来执行分析型负载时,一种常见的做法是将数据从分布式数据库加载到分布式计算引擎来执行各种分析型负载。然而,在一些特定的分析任务中,如机器学习推理任务,数据从分布式数据库加载到计算引擎的时间成为了整体推理任务的瓶颈。所以,如何降低数据从分布式数据库加载到计算引擎的时间,成为一个需要解决的技术问题。
50.传统的将分布式数据库中的数据加载到计算引擎的方法有两种:1)将分布式数据库中的数据导出到外部中间存储系统,如hdfs(hadoop distributed file system,hadoop分布式文件系统),kafka分布式发布订阅消息系统。然后,再将中间存储系统中的数据加载到计算引擎。这种数据加载方法带来了额外的数据转储的开销。2)计算引擎直接从分布式数据库获取数据。例如,通过jdbc(java database connectivity,java数据库连接)接口加
载分布式数据库中的数据。但是,由于通用jdbc接口通常只支持常规数据读取方式,而不能针对分布式数据库的读取特性进行优化,因此这种数据加载方式的性能常常较低。例如,计算引擎通常可以通过jdbc接口,根据表的某个字段的值域对表数据进行划分,然后通过多个并行执行的任务对划分后的表数据进行并行加载。在一个例子中,例如可以根据表a的字段a1的值,按a1》=40000、40000》a1》=20000、a1《20000的划分条件,将表a的表数据分别通过三个加载任务并行加载。这种并行加载方式在对表数据进行合理划分的情况下,可以在一定程度上加速数据加载。然而,其仍然存在如下问题:1)计算引擎中各个任务的数据加载是否均衡取决于对表是否均衡划分。但是,按值域进行表划分不容易均衡,即使表面的划分条件看上是平均的。例如,上述a1》=40000、40000》a1》=20000、a1《20000的划分条件,按照字段取值范围(即值域)的标准,似乎是平均的。但是,表数据的实际分布和取值范围分布常常是不同的,或者说,不同的取值范围的实际数据分布常常是不同的。例如,a1的值实际上主要分布在10000~20000之间,那么按照上面的条件进行划分,其划分结果显然不均衡的。不均衡的数据划分会拖慢整体加载时间,还会造成依据加载数据的后续数据计算的不均衡。2)当任务访问的表数据分布在多个物理机的分区上,会带来了跨主机访问的开销。3)表数据可能随机分布在不同的分区上,在单个节点内或不同的节点间,加载表数据均会带来非连续访问的开销。
51.为了解决上述技术问题,本说明书实施例提供了一种计算引擎从分布式数据库加载数据的方法。该方法的核心思想是,从分布式数据库获取要加载的数据表的分区信息,分区信息中包括数据表的各个分区所存放的存储节点的标识信息(例如ip地址),然后根据各个分区信息,生成于各个存储节点对应的加载任务,这些加载任务优先进行本地存放的分区的加载。然后,将各个加载任务,分别分配给计算引擎在该任务对应存储节点上的任务执行器,并行执行。图1示出根据本说明书实施例的一种计算引擎从分布式数据库加载数据的方法的原理示意图。如图1所示,表a的多个分区(例如p1,p2,p3,p4,p5,p6)分散保存在分布式数据库的多个存储节点(例如节点1,节点2,节点3),在对表a的数据进行加载时,计算引擎根据该表的各个分区进行加载。具体的,可以将p1、p3分配给通过其所在存储节点(节点1)上的任务执行器执行的加载任务1,将p2、p5分配给通过其所在存储节点(节点2)上的任务执行器执行的加载任务2,将p4、p6分配给通过其所在存储节点(节点3)上的任务执行器执行的加载任务3,并行执行加载任务1、2、3。
52.采用上述方法具有如下优点:1)由于分布式数据库的各个分区包含的数据量大致相同,基于分区进行加载任务的分配调度,可以保证每个任务加载的数据处于均衡状态。即使其他的查询条件或数据本身的分布存在严重的不均衡,也不会造成各个任务加载的数据量严重不均衡。2)优先使得加载任务加载本地节点的分区,可以有效减少了跨节点分布式访问的开销。3)由于分布式数据库的每个分区通常在物理上连续存储在存储介质中,因此按照分区进行数据加载,即使在单个节点内通常也不存在非连续性访问的开销。由于通常无需在不同的节点间加载数据,更不存在不同的节点间的非连续性访问的开销。
53.图2示出根据本说明书实施例的一种计算引擎从分布式数据库加载数据的方法的时序流程图。分布式数据库包括多个存储节点,如图2所示,该方法包括:
54.首先,在步骤s202,计算引擎接收用户客户端提交的应用代码。该应用代码中包括针对分布式数据库中的表数据的加载指示。即在该应用代码的执行中,会加载分布式数据
库中的表数据。具体的,在一个实施例中,应用代码中例如可以包括对于第一数据表的查询,即应用代码中具有对于第一数据表的表数据的加载指示。可以理解,在不同的实施例中,应用代码可以包括至少一个数据表的查询,至少一个数据表中的各数据表的加载过程是类似的。所以,为了方便描述,下面主要以其中的一个数据表(第一数据表)为例说明其加载过程。在不同的实施例中,还可以根据应用代码中的限定条件,加载第一数据表的全部或部分数据。
55.需要注意的,本说明书中的实施例只关注数据加载过程本身,对于加载的数据用于何种具体目的并不关注。在不同的实施例中,加载的表数据可以用于不同的具体目的,例如不同具体类型的计算,如流计算、机器学习、图计算等,本说明书对此不作限定。
56.本说明书中的计算引擎是指可以具有多个计算节点的分布式计算引擎,在不同的实施例中,所述计算引擎可以是不同具体类型的计算引擎,本说明书对此不做限定。在一个实施例中,计算引擎可以为spark计算引擎。在一个具体的实施例中,所述应用代码可以是spark ml应用代码。分布式数据库是支持表分区、且可以按分区进行表数据查询的分布式数据库。在不同的实施例中,所述分布式数据库可以是不同具体类型的分布式数据库,本说明书对此不做限制。在一个实施例中,分布式数据库可以为oceanbase数据库。在不同的实施例中,分布式数据库的存储节点可以是基于物理节点、虚拟机节点或容器节点中的一种或多种的存储节点。
57.然后,在步骤s204,计算引擎根据接收的应用代码,确定要从分布式数据库中加载到计算引擎的数据表。该步骤中,根据步骤s202中接收的应用代码,确定其具体要加载的数据表,其中例如包括第一数据表。
58.需要注意的是,在不同的实施例中,步骤s202和步骤s204并非一定是必要的。步骤202和步骤s204的主要目的是确定需要加载的数据表。根据其他的实施例,也可以通过其他方式确定需要加载的数据表。例如,根据计算引擎中事先部署的应用,确定其中要加载的数据表,或者根据远程api的调用,确定计算引擎需要加载的数据表。
59.在确定要加载的数据表之后,在步骤s206,计算引擎向分布式数据库请求要加载的数据表的分区信息。
60.一般而言,在分布式数据库中,数据表的分区是数据表的子集。数据表的分区通常按照记录索引或主键索引(例如可以体现为行号)进行划分。例如,一个20000行的数据表可以按行划分为4个分区,其中连续的5000行对应一个分区。不同分区可以存放在分布式数据库的不同存储节点(主机)上。使用分区的好处主要在于:对于单个数据表的处理可以获得多个主机的处理能力。还可以快速定位到需要查询的分区,对表数据的操作的粒度也可以控制在单个分区,从而提高查询和操作的性能。该步骤中,请求的分区信息包括要加载的数据表具有的各个分区、以及各个分区所在的存储节点的标识,从而可以根据所述标识,确定各个分区所在的存储节点。在不同的实施例中,用于确定存储节点的标识,可以是不同的。例如,在一个实施例中,存储节点的标识可以为存储节点的ip地址。在另一个实施例中,存储节点的标识也可以为存储节点的主机名称。
61.此外,分布式数据库中的一个分区可以有存放在不同节点的多个副本,其中,主副本主要用于对外提供数据访问,其他副本从主副本同步数据,主要用于故障恢复目的。可以理解,由于由主副本提供数据访问,分区所在存储节点可以等同于分区的主副本所在的存
储节点。
62.然后,在步骤s208,计算引擎接收分布式数据库发送的数据表的分区信息。该步骤中,从分布式数据库接收的分区信息即步骤s206中请求的分区信息,可以参见对于步骤s206的描述,这里不再赘述。
63.获取分区信息后,在步骤s210,计算引擎根据分区信息进行分区调度,生成针对若干存储节点的若干加载任务。
64.该步骤中,则按照表的分区,生成分别在各个存储节点执行的加载任务,用于在后续步骤中对表数据进行并行加载。常规加载任务量的调度算法通常基于round-robin轮询调度算法。根据轮询调度来分配各个节点上的加载任务,即为按照分区本身的序号,顺序分配给各个存储节点的加载任务。但是,这种方式存在的问题在于:各个分区通常不是依据顺序在各个节点上的进行存储。进而,如果依据分区序号,顺序分配给加载的存储节点,则各个存储节点上执行的加载任务,存在很大概率要加载保存在其他存储节点上的分区,这将造成大量远程读取的开销。图3示出通过常规轮询调度按分区序号加载表数据的原理示意图。如图3所示,表a的多个分区(例如p1,p2,p3,p4,p5,p6)分散保存在分布式数据库的多个存储节点(例如节点1,节点2,节点3),在对表a的数据进行加载时,如果基于常规轮询调度,分配各个节点的加载任务,则会例如将p1、p2分配给节点1上的加载任务1,将p3、p4分配给节点2上的加载任务2,将p5、p6分配给节点3上的加载任务3。可以看到,任务1需要远程访问节点2,去加载p2。同样,任务2需要远程访问节点1和节点3,去加载p3、p4,加载任务3需要远程访问节点2,去加载p5。这些远程进行的数据加载,不仅执行效率低,并且还会对网络造成很大压力。
65.为解决这个问题,该步骤中,分区调度在生成分别在各个存储节点执行的加载任务时,将要加载的数据表的各个分区,优先分配给其所在的存储节点上的加载任务。例如,如前所述,在图1所示的实施例中,任务1加载p1、p3,任务2加载p2、p5,任务3加载p4、p6,即各存储节点上执行的加载任务均加载本地存储的分区。与图3所示的加载方式相比,没有远程访问的开销,大大提高了数据加载的效率。
66.为了保证各个存储节点上的加载任务的执行效率,还可以限定各存储节点的加载分区的数量上限。因此,在一个实施例中,存储节点可以具有对应的分配上限阈值;进而,对于任意存储节点,若其本地分区的数量不超过所述分配上限阈值,可以将其全部本地分区分配给该存储节点对应的加载任务。在一个实施例中,分配上限阈值为所述存储节点的处理器内核数量。当存储节点上的分区超过其分配上限时,可以将超出的分区分配给其他节点上的加载任务。因此,在另一个实施例中,若其本地分区的数量超过所述分配上限阈值,还可以将其中所述分配上限阈值数量的本地分区分配给该存储节点对应的加载任务;将其余的本地分区分配给其他存储节点的加载任务。
67.接着,在步骤s212,将各加载任务分配到各存储节点中的任务执行器,并行执行。
68.分布式的计算引擎可以具有多个计算节点,并通过多个计算节点上的任务执行器,分别并行执行不同的任务(task)。该步骤中,计算引擎的各计算节点,可以和分布式数据库的各存储节点使用相同的主机,也就是说分布式数据库的存储节点同时也是分布式数据库的计算节点。从而可以将步骤s210中生成的各加载任务,分配到其对应的存储节点中的任务执行器执行,并行执行。
69.此后,在各加载任务执行后,在步骤s214,计算引擎从分布式数据库获取各个加载任务加载的数据。即,计算引擎的各个计算节点,在其本地的加载任务执行后,优先从本地存储的分区获取了加载数据。在上述本地分区数量没有超出节点分配上限的实施例中,本地分区全部由本地任务加载到所在计算节点。在上述本地分区数量超出节点分配上限的实施例中,超出的本地分区可以由其他计算节点上的任务加载到其他计算节点。
70.综上所述,本说明书实施例的一种计算引擎从分布式数据库加载数据的方法,具有的优点如下:一方面,相对于传统的根据值域划分表数据的并行表数据加载方法,优先加载本地分区的并行表数据加载方法,并行执行的加载任务的加载数据量更为均衡,加载效率更高。并且,数据加载中的跨节点分布式访问开销、以及非连续性访问开销也明显更少。相对于基于常规轮询调度的并行分区加载,数据加载中的跨节点分布式访问开销也更少。另一方面,在获取数据加载性能提升的同时,对于编写应用的用户而言,对其编程方式基本没有添加额外的负担的情况,且由于用户无需再考虑如何规划并行加载,方便了用户的应用编写工作。
71.上面介绍了根据本说明书实施例的一种计算引擎从分布式数据库加载数据的方法。根据另一方面的实施例,还提供一种计算引擎从分布式数据库加载数据的装置。图4示出根据本说明书实施例的一种计算引擎从分布式数据库加载数据的装置的结构图。分布式数据库包括多个存储节点,如图4所示,该装置400包括:
72.分区信息获取单元41,配置为,获取分布式数据库中第一数据表的分区信息,其中,所述分区信息包括第一数据表的各个分区所在的存储节点的标识;
73.任务确定单元42,配置为,根据所述分区信息执行分区调度,生成针对若干存储节点的若干加载任务;所述分区调度优先将所述各个分区分配给所在的存储节点对应的加载任务;
74.任务分配单元43,配置为,将所述若干加载任务分别分配给所述若干存储节点中的任务执行器,使其并行执行所述若干加载任务。
75.在一个实施例中,计算引擎可以为spark计算引擎,分布式数据库可以为oceanbase数据库。
76.在一个实施例中,存储节点的标识可以为存储节点的ip地址。
77.在一个实施例中,存储节点可以基于物理节点、虚拟机节点或容器节点中的一种或多种。
78.在一个实施例中,存储节点可以具有对应的分配上限阈值;
79.任务确定单元,可以进一步配置为:
80.对于任意存储节点,
81.若其本地分区的数量不超过所述分配上限阈值,将其全部本地分区分配给该存储节点对应的加载任务。
82.在一个实施例中,分配上限阈值可以为所述存储节点的处理器内核数量。
83.在一个实施例中,任务确定单元,进一步配置为:
84.若其本地分区的数量超过所述分配上限阈值,将其中所述分配上限阈值数量的本地分区分配给该存储节点对应的加载任务;
85.将其余的本地分区分配给其他存储节点的加载任务。
86.在一个实施例中,该装置还可以包括,表加载指示获取单元,配置为:
87.在获取分布式数据库中第一数据表的分区信息之前,
88.获取客户端提交的应用,所述应用中包括针对第一数据表的加载指示。
89.根据又一方面的实施例,还提供一种计算机可读存储介质,其上存储有计算机程序,当所述计算机程序在计算机中执行时,令计算机执行上述的方法。
90.根据再一方面的实施例,还提供一种计算设备,包括存储器和处理器,所述存储器中存储有可执行代码,所述处理器执行所述可执行代码时,实现上述的方法。
91.需要理解,本文中的“第一”,“第二”等描述,仅仅为了描述的简单而对相似概念进行区分,并不具有其他限定作用。
92.本领域技术人员应该可以意识到,在上述一个或多个示例中,本发明所描述的功能可以用硬件、软件、固件或它们的任意组合来实现。当使用软件实现时,可以将这些功能存储在计算机可读介质中或者作为计算机可读介质上的一个或多个指令或代码进行传输。
93.以上所述的具体实施方式,对本发明的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本发明的具体实施方式而已,并不用于限定本发明的保护范围,凡在本发明的技术方案的基础之上,所做的任何修改、等同替换、改进等,均应包括在本发明的保护范围之内。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1