一种分布式数据库的数据处理方法及装置
文献发布时间:2023-06-19 09:27:35
技术领域
本发明涉及数据处理领域,具体而言,涉及一种分布式数据库的数据处理方法及装置。
背景技术
在当前开源数据库Greenplum中,为了实现两个表的关联查询,如果where条件中做join(关联)的列与某个表的分布键不相同,则需要把该表的数据按照关联的列做重新分布(即数据重分布),类似于Hadoop生态系统中的Shuffle机制。
相关技术中提出的分布式关系数据库的数据处理方法,统计数据分布以及制定数据重分布计划比较耗时,在一个节点上进行,会将这个过程串行化,导致效率低下;现有的数据迁移算法一般追求将每个表的数据重新分布到各个节点,这样造成数据重新分布的代价过高。数据处理使得在两表关联时,连接条件都不是分布键时,只需要重新分布一张表的数据。
针对相关技术中两表关联查询时需要重新分布一张表的数据,增加了网络压力和时间开销的问题,尚未提出解决方案。
发明内容
本发明实施例提供了一种分布式数据库的数据处理方法及装置,以至少解决相关技术中两表关联查询时需要重新分布一张表的数据,增加了网络压力和时间开销的问题。
根据本发明的一个实施例,提供了一种分布式数据库的数据处理方法,包括:
接收包括第一表与第二表中相同属性的待关联列的业务需求,其中,所述第一表与所述第二表中至少包括一列相同属性的数据;
根据所述业务需求创建包括第一列组的所述第一表和包括第二列组的所述第二表,其中,所述第一列组与所述第二列组均包括所述待关联列;
将所述第一表按照所述第一列组分布数据,并将所述第二表按照所述第二列组分布数据。
可选地,在根据所述业务需求创建包括所述第一列组的所述第一表与包括所述第二列组的所述第二表之后,所述方法还包括:
为所述第一列组创建对应的第一子表,并将所述第一子表发送给多个数据节点,其中,所述多个数据节点用于存储所述第一子表;
为所述第二列组创建对应的第二子表,并将所述第二子表发送给所述多个数据节点,其中,所述多个数据节点用于存储所述第二子表。
可选地,将所述第一表按照所述第一列组分布数据,并将所述第二表按照所述第二列组分布数据包括:
将所述第一表的数据按照所述第一列组确定对应的第一哈希值,并根据所述第一哈希值将所述第一表的数据插入到所述多个数据节点的所述第一子表中;
将所述第二表的数据按照所述第二列组确定对应的第二哈希值,并根据所述第二哈希值将所述第二表的数据插入到所述多个数据节点的所述第二子表中。
可选地,所述方法还包括:
在所述第一列组或所述第二列组包括至少2个列组,且检测到删除所述第一列组或所述第二列组中的第一目标列组的情况下,删除所述第一目标列组对应的子表。
可选地,在将所述第一表按照所述第一列组分布数据,并将所述第二表按照所述第二列组分布数据之后,所述方法还包括:
根据所述第一列组对应的第一子表与所述第二列组对应的第二子表对所述第一表与所述第二表进行数据关联处理。
可选地,根据所述第一列组对应的第一子表与所述第二列组对应的第二子表对所述第一表与所述第二表进行数据关联处理包括:
接收关联查询指令,其中,所述关联查询指令中包括所述第一表与所述第二表的关联条件,所述关联条件包括所述待关联列;
根据所述关联条件从所述第一列组中确定第二目标列组;
根据所述第二目标列组对应的子表与所述第二表进行数据关联处理。
根据本发明的另一个实施例,还提供了一种分布式数据库的数据处理装置,包括:
接收模块,用于接收包括第一表与第二表中相同属性的待关联列的业务需求,其中,所述第一表与所述第二表中至少包括一列相同属性的数据;
创建模块,用于根据所述业务需求创建包括第一列组的所述第一表与包括第二列组的所述第二表,其中,所述第一列组与所述第二列组均包括所述待关联列;
分布数据模块,用于将所述第一表按照所述第一列组分布数据,并将所述第二表按照所述第二列组分布数据。
可选地,所述装置还包括:
第一发送模块,用于为所述第一列组创建对应的第一子表,并将所述第一子表发送给多个数据节点,其中,所述多个数据节点用于存储所述第一子表;
第二发送模块,用于为所述第二列组创建对应的第二子表,并将所述第二子表发送给所述多个数据节点,其中,所述多个数据节点用于存储所述第二子表。
可选地,所述分布数据模块包括:
第一插入子模块,用于将所述第一表的数据按照所述第一列组确定对应的第一哈希值,并根据所述第一哈希值将所述第一表的数据插入到所述多个数据节点的所述第一子表中;
第二插入子模块,用于将所述第二表的数据按照所述第二列组确定对应的第二哈希值,并根据所述第二哈希值将所述第二表的数据插入到所述多个数据节点的所述第二子表中。
可选地,所述装置还包括:
删除模块,用于在所述第一列组或所述第二列组包括至少2个列组,且检测到删除所述第一列组或所述第二列组中的第一目标列组的情况下,删除所述第一目标列组对应的子表。
可选地,所述装置还包括:
关联处理模块,用于根据所述第一列组对应的第一子表与所述第二列组对应的第二子表对所述第一表与所述第二表进行数据关联处理。
可选地,所述关联处理模块包括:
接收子模块,用于接收关联查询指令,其中,所述关联查询指令中包括所述第一表与所述第二表的关联条件,所述关联条件包括所述待关联列;
确定子模块,用于根据所述关联条件从所述第一列组中确定第二目标列组;
关联处理子模块,用于根据所述第二目标列组对应的子表与所述第二表进行数据关联处理。
根据本发明的又一个实施例,还提供了一种计算机可读的存储介质,所述存储介质中存储有计算机程序,其中,所述计算机程序被设置为运行时执行上述任一项方法实施例中的步骤。
根据本发明的又一个实施例,还提供了一种电子装置,包括存储器和处理器,所述存储器中存储有计算机程序,所述处理器被设置为运行所述计算机程序以执行上述任一项方法实施例中的步骤。
通过本发明,接收到包括相同属性的待关联列的业务需求之后,根据业务需求创建包括第一列组的第一表与包括第二列组的第二表,将第一表按照第一列组分布数据,并将第二表按照第二列组分布数据,由于第一列组与第二列组均包括待关联列,第一表通过按照第一列组分布数据,第二表通过第二列组分布数据,使得关联查询时可以直接查询到关联的列或列组,可以解决相关技术中两表关联查询时需要重新分布一张表的数据,增加了网络压力和时间开销的问题,根据实际的业务使用需求,创建表时包括多个列组,以控制数据的分布方式,使得关联查询时无需重新分布表的数据,加快数据处理的效率。
附图说明
此处所说明的附图用来提供对本发明的进一步理解,构成本申请的一部分,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:
图1是本发明实施例的分布式数据库的数据处理方法的移动终端的硬件结构框图;
图2是根据本发明实施例的分布式数据库的数据处理方法的流程图;
图3是根据本发明实施例的Greenplum分布式数据库的示意图;
图4是根据本发明实施例的stu表的数据分布的示意图;
图5是根据本发明实施例的分布式数据库的数据处理装置的框图;
图6是根据本发明优选实施例的分布式数据库的数据处理装置的框图。
具体实施方式
下文中将参考附图并结合实施例来详细说明本发明。需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合。
需要说明的是,本发明的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。
实施例1
本申请实施例一所提供的方法实施例可以在移动终端、计算机终端或者类似的运算装置中执行。以运行在移动终端上为例,图1是本发明实施例的分布式数据库的数据处理方法的移动终端的硬件结构框图,如图1所示,移动终端可以包括一个或多个(图1中仅示出一个)处理器102(处理器102可以包括但不限于微处理器MCU或可编程逻辑器件FPGA等的处理装置)和用于存储数据的存储器104,可选地,上述移动终端还可以包括用于通信功能的传输设备106以及输入输出设备108。本领域普通技术人员可以理解,图1所示的结构仅为示意,其并不对上述移动终端的结构造成限定。例如,移动终端还可包括比图1中所示更多或者更少的组件,或者具有与图1所示不同的配置。
存储器104可用于存储计算机程序,例如,应用软件的软件程序以及模块,如本发明实施例中的分布式数据库的数据处理方法对应的计算机程序,处理器102通过运行存储在存储器104内的计算机程序,从而执行各种功能应用以及数据处理,即实现上述的方法。存储器104可包括高速随机存储器,还可包括非易失性存储器,如一个或者多个磁性存储装置、闪存、或者其他非易失性固态存储器。在一些实例中,存储器104可进一步包括相对于处理器102远程设置的存储器,这些远程存储器可以通过网络连接至移动终端。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
传输装置106用于经由一个网络接收或者发送数据。上述的网络具体实例可包括移动终端的通信供应商提供的无线网络。在一个实例中,传输装置106包括一个网络适配器(Network Interface Controller,简称为NIC),其可通过基站与其他网络设备相连从而可与互联网进行通讯。在一个实例中,传输装置106可以为射频(Radio Frequency,简称为RF)模块,其用于通过无线方式与互联网进行通讯。
在本实施例中提供了一种运行于上述移动终端或网络架构的分布式数据库的数据处理方法,图2是根据本发明实施例的分布式数据库的数据处理方法的流程图,如图2所示,该流程包括如下步骤:
步骤S202,接收包括第一表与第二表中相同属性的待关联列的业务需求,其中,所述第一表与所述第二表中至少包括一列相同属性的数据;
图3是根据本发明实施例的Greenplum分布式数据库的示意图,如图3所示,具体可以是主节点接收上层发送的业务需求,Greenplum的架构采用了MPP(大规模并行处理),在MPP系统中,每个物理节点有自己的操作系统、数据库等。换言之,每个节点内的CPU不能访问另一个节点的内存。节点之间的信息交互是通过节点间的网络互连实现的。Master节点也叫管理节点,负责集群的管理,保存集群的元数据,负责客户端交互,Segment节点也叫数据节点,每个数据节点只存储一部分数据。
本发明实施例中采用的分布策略是DISTRIBUTED BY(column,[…]),根据指定的一列或多列作为一个整体计算出相应的hash值来决定数据分布在哪个segment节点。
本发明实施例中,业务需要可以是上层发送的,业务需求中会指示两个表中(第一表与第二表)需要做关联处理的列,例如,第一表为Stu表,第二表为Course表,业务需求中指示学生表中的course_no与课程表中的course_no关联。
Stu表的表结构如下:
Course表的表结构如下:
步骤S204,根据所述业务需求创建包括第一列组的所述第一表与包括第二列组的所述第二表,其中,所述第一列组与所述第二列组均包括所述待关联列;
步骤S206,将所述第一表按照所述第一列组分布数据,并将所述第二表按照所述第二列组分布数据。
通过上述步骤S202至S206,可以解决相关技术中两表关联查询时需要重新分布一张表的数据,增加了网络压力和时间开销的问题,根据实际的业务使用需求,创建表时包括多个列组,以控制数据的分布方式,使得关联查询时无需重新分布表的数据,加快数据处理的效率。
在一可选的实施例中,在上述步骤S204之后,为所述第一列组创建对应的第一子表,并将所述第一子表发送给多个数据节点,其中,所述多个数据节点用于存储所述第一子表;为所述第二列组创建对应的第二子表,并将所述第二子表发送给所述多个数据节点,其中,所述多个数据节点用于存储所述第二子表。
本发明实施例中,上述步骤S206具体可以包括:将所述第一表的数据按照所述第一列组确定对应的第一哈希值,并根据所述第一哈希值将所述第一表的数据插入到所述多个数据节点的所述第一子表中;将所述第二表的数据按照所述第二列组确定对应的第二哈希值,并根据所述第二哈希值将所述第二表的数据插入到所述多个数据节点的所述第二子表中。
在另一可选的实施例中,在所述第一列组或所述第二列组包括至少2个列组,且检测到删除第一列组或第二列组中的第一目标列组的情况下,删除所述第一目标列组对应的子表。
在另一可选的实施例中,在将所述第一表按照所述第一列组分布数据,并将所述第二表按照所述第二列组分布数据之后,根据所述第一列组对应的第一子表与所述第二列组对应的第二子表对所述第一表与所述第二表进行数据关联处理,具体的,接收关联查询指令,其中,所述关联查询指令中携带有所述第一表与所述第二表的关联条件,所述关联条件包括所述待关联列;根据所述关联条件从所述第一列组中确定第二目标列组;根据所述第二目标列组对应的子表与所述第二表进行数据关联处理。
下面以第一表为Stu表,第二表为Course表为例,对本发明实施例进行说明。
本发明实施例通过扩展建表语句选项distributed by子句的语法,指定一个或多个{列组},同时实现多种分布策略。通过查询表的{列组}和相关子表元数据信息,实现在数据插入时,把数据插入到对应的子表中。3、通过查询表的{列组}和相关子表元数据信息,实现在关联查询时,自动选择合适的子表做真实数据关联。通过调整(增加/删除)表的{列组}设置,实现动态调整表的分布策略。
数据存储阶段,在建表时,同样使用DISTRIBUTED BY(column,[…])分布策略,但是本实施例把建表设计成可以按照{列组}分布。使用这种语法DISTRIBUTED BY({column,[…]},[…]),通俗的说就是一个表可以同时按照多个{列组}分布数据。基于这样一个事实,一张表可能会设置N个字段,但是在实际业务使用的过程中,只有少数几列(也可称为字段)是经常需要与其它表关联查询的时候用到,很大一部分的列都只是为了数据存储和展示用途。所以可以只针对这些经常需要关联其它表的列设置成分布{列组}。
Stu表的建表语句格式如下:
创建学生表create table stu(
学生学号stu_no int,
学生姓名stu_name text,
选修课程号course_no int)
以包括学生学号、选修课程号的列组的方式分布数据Distributed by({stu_no},{course_no})。
Course表的建表语句格式如下:
创建课程表create table course(
课程编号course_no int,
课程名称course_name text,
教师编号tech_no int)
以包括课程编号、教师编号的列组的方式分布数据Distributed by({course_no},{tech_no})。
若stu表为上述的第一表,course表为上述的第二表,上述的第一列组可以为包括学生学号、选修课程号的列组,上述的第二列组可以为包括课程编号、教师编号的列组,上述待关联列可以为相同属性的course_no,需要的说明的是,本发明实施例中的待关联列可以为一个或多个列,若在创建表时一多个列作为待关联列,在查询时,关联条件中可以是待关联列中的一个或多个列。
当表存在{列组}时,会根据{列组}的信息,自动创建相应的子表,命名规则可以为:【表名】_g【列组序号】,列组序号从1开始编号,以在Distributed by子句中出现的顺序排列。同样在删除{列组}时,会自动删除对应的子表。一个表{列组}及其子表的元数据信息保存在Master节点。设置了{列组}的表,在插入数据时,数据会根据{列组}信息,自动插入到相应的子表中。
数据查询时,如果主节点接收到以下一个SQL的查询:select*from stu,coursewhere stu.course_no=course.course_no。在查询的时候,根据关联的条件列来自动选择对应的分布{列组},即选取根据第一表中的列组course_no分布的数据与第二表中列组course_no分布的数据进行关联,以达到数据不需要重分布的目的。使用了{列组}分布后的SQL执行计划,可以看到不再存在数据重分布(Redistribute Motion)。
查询语句的格式如下:
QUERY PLAN(SQL语句的执行计划)
Gather Motion 4:1(slice1;segments:4)(cost=1.01..743.60rows=47width=80)
#数据汇总到master节点,cost=xx是执行的成本估计
->Hash Join(cost=1.01..743.60rows=12width=80)
#执行哈希连接
Hash Cond:(course.course_no=stu_g2.course_no)
#哈希连接条件
->Seq Scan on course(cost=0.00..567.00rows=11675width=40)对course表执行顺序扫描
->Hash(cost=1.00..1.00rows=1width=40)
#把stu表扫描到的数据放入hash链表
->Seq Scan on stu(cost=0.00..1.00rows=1width=40)
#对于stu表执行顺序扫描
Optimizer:Postgres query optimizer
#说明执行计划由传统优化器产生
(7rows)
#整个计划执行的行数
在实现查询时,如果stu表和其它表关联,where子句中使用course_no列作为关联条件,则数据库会根据表分布的{列组}信息,选择使用stu_g2子表去做实际的数据关联查询,以达到数据不重新分布的目的。当然如果使用stu表的stu_name列和其它表做关联,因为上面没有给这个stu_name列设置单独的{列组},还是会需要数据重分布。所以是否需要为某列设置{列组},需要根据实际的业务情况考量,权衡数据的空间占用和时间收益。
数据空间占用情况,如果建表时设置了n个{列组},则该表的数据空间占用会比原始存储空间大n-1倍。即与空间换时间同理。至于每个表设置几个{列组},应该根据业务使用情况和空间配置情况做综合权衡。在生产环境下,由于空间的临时吃紧,可以使用修改表结构的语法,临时删除一个{列组},临时处理磁盘空间的问题。但必须保证一个表至少有一个{列组}存在。
图4是根据本发明实施例的stu表的数据分布的示意图,如图4所示,设置了以stu_no和course_no两个列组分布的数据空间存储,Stu表设置了两个{列组},所以Stu表的数据在集群中存储了两份。
本发明实施例可以在一个表上同时设置多种数据分布方式,即基于多个列组分布存储数据,根据实际的业务使用需求,动态管理(增加/删除){列组},以动态控制数据的分布策略。底层{列组}的调整对上层业务无感知。
实施例2
根据本发明的另一个实施例,还提供了一种分布式数据库的数据处理装置,图5是根据本发明实施例的分布式数据库的数据处理装置的框图,如图5所示,包括:
接收模块52,用于接收包括第一表与第二表中相同属性的待关联列的业务需求,其中,所述第一表与所述第二表中至少包括一列相同属性的数据;
创建模块54,用于根据所述业务需求创建包括第一列组的所述第一表与包括第二列组的所述第二表,其中,所述第一列组与所述第二列组均包括所述待关联列;
分布数据模块56,用于将所述第一表按照所述第一列组分布数据,并将所述第二表按照所述第二列组分布数据。
图6是根据本发明优选实施例的分布式数据库的数据处理装置的框图,如图6所示,所述装置还包括:
第一发送模块62,用于为所述第一列组创建对应的第一子表,并将所述第一子表发送给多个数据节点,其中,所述多个数据节点用于存储所述第一子表;
第二发送模块64,用于为所述第二列组创建对应的第二子表,并将所述第二子表发送给所述多个数据节点,其中,所述多个数据节点用于存储所述第二子表。
可选地,所述分布数据模块56包括:
第一插入子模块,用于将所述第一表的数据按照所述第一列组确定对应的第一哈希值,并根据所述第一哈希值将所述第一表的数据插入到所述多个数据节点的所述第一子表中;
第二插入子模块,用于将所述第二表的数据按照所述第二列组确定对应的第二哈希值,并根据所述第二哈希值将所述第二表的数据插入到所述多个数据节点的所述第二子表中。
可选地,所述装置还包括:
删除模块,用于在所述第一列组或所述第二列组包括至少2个列组,且检测到删除第一列组或第二列组中的第一目标列组的情况下,删除所述第一目标列组对应的子表。
可选地,所述装置还包括:
关联处理模块,用于根据所述第一列组对应的第一子表与所述第二列组对应的第二子表对所述第一表与所述第二表进行数据关联处理。
可选地,所述关联处理模块包括:
接收子模块,用于接收关联查询指令,其中,所述关联查询指令中包括所述第一表与所述第二表的关联条件,所述关联条件包括所述待关联列;
确定子模块,用于根据所述关联条件从所述第一列组中确定第二目标列组;
关联处理子模块,用于根据所述第二目标列组对应的子表与所述第二表进行数据关联处理。
需要说明的是,上述各个模块是可以通过软件或硬件来实现的,对于后者,可以通过以下方式实现,但不限于此:上述模块均位于同一处理器中;或者,上述各个模块以任意组合的形式分别位于不同的处理器中。
实施例3
本发明的实施例还提供了一种计算机可读的存储介质,该存储介质中存储有计算机程序,其中,该计算机程序被设置为运行时执行上述任一项方法实施例中的步骤。
可选地,在本实施例中,上述存储介质可以被设置为存储用于执行以下步骤的计算机程序:
S1,接收包括第一表与第二表中相同属性的待关联列的业务需求,其中,所述第一表与所述第二表中至少包括一列相同属性的数据;
S2,根据所述业务需求创建包括第一列组的所述第一表与包括第二列组的所述第二表,其中,所述第一列组与所述第二列组均包括所述待关联列;
S3,将所述第一表按照所述第一列组分布数据,并将所述第二表按照所述第二列组分布数据。
可选地,在本实施例中,上述存储介质可以包括但不限于:U盘、只读存储器(Read-Only Memory,简称为ROM)、随机存取存储器(Random Access Memory,简称为RAM)、移动硬盘、磁碟或者光盘等各种可以存储计算机程序的介质。
实施例4
本发明的实施例还提供了一种电子装置,包括存储器和处理器,该存储器中存储有计算机程序,该处理器被设置为运行计算机程序以执行上述任一项方法实施例中的步骤。
可选地,上述电子装置还可以包括传输设备以及输入输出设备,其中,该传输设备和上述处理器连接,该输入输出设备和上述处理器连接。
可选地,在本实施例中,上述处理器可以被设置为通过计算机程序执行以下步骤:
S1,接收包括第一表与第二表中相同属性的待关联列的业务需求,其中,所述第一表与所述第二表中至少包括一列相同属性的数据;
S2,根据所述业务需求创建包括第一列组的所述第一表与包括第二列组的所述第二表,其中,所述第一列组与所述第二列组均包括所述待关联列;
S3,将所述第一表按照所述第一列组分布数据,并将所述第二表按照所述第二列组分布数据。
可选地,本实施例中的具体示例可以参考上述实施例及可选实施方式中所描述的示例,本实施例在此不再赘述。
显然,本领域的技术人员应该明白,上述的本发明的各模块或各步骤可以用通用的计算装置来实现,它们可以集中在单个的计算装置上,或者分布在多个计算装置所组成的网络上,可选地,它们可以用计算装置可执行的程序代码来实现,从而,可以将它们存储在存储装置中由计算装置来执行,并且在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤,或者将它们分别制作成各个集成电路模块,或者将它们中的多个模块或步骤制作成单个集成电路模块来实现。这样,本发明不限制于任何特定的硬件和软件结合。
以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
- 一种分布式数据库数据处理方法和分布式数据库系统
- 一种针对分布式数据库的数据处理方法、装置及系统