掌桥专利:专业的专利平台
掌桥专利
首页

一种基于分布式图数据库的图遍历算法

文献发布时间:2023-06-19 16:08:01



技术领域

本发明涉及分布式存储索引技术领域,具体涉及一种基于分布式图数据库的图遍历算法。

背景技术

随着各种互联网应用的蓬勃发展,大规模数据下的复杂关系给传统的关系型数据库带来了巨大的挑战。在传统的关系型数据库领域,查询同某个实体的相关联的其它实体,或继续以此向外延伸,数据库使用者需要编写冗长的SQL语句,同时数据库系统通常会进行复杂的多表join操作,查询性能并不理想。这类数据之间关联性查询,成为了关系型数查询。图数据库的出现,能够很好的解决关系型数据库所面临的实体关联类查询的性能瓶颈,推动数据库系统领域的发展。

在目前的分布式图数据库中,有多种不同架构的方案。为了让计算节点和存储节点可以根据实际的业务需求,灵活地横向扩展,通常的方案都是计算节点与存储节点分离。与此同时,分布式图数据库的网络通信成本也随之增大(副作用),每次查询需要从存储节点拉取大量的数据到计算节点进行计算,计算节点与存储节点之间的网络I/O效率成为了分布式图数据库的性能瓶颈之一。

现有技术中,图遍历被划分成NodesFilter算子和Expand算子的组合,这意味着需要依赖计算节点来保持图遍历的中间结果,中间结果的序列化、反序列化以及网络I/O的开销对图遍历的性能影响较大。

发明内容

本发明提供了一种基于分布式图数据库的图遍历算法,解决图遍历过程对计算节点依赖性较大,开销较高的问题。

本发明通过下述技术方案实现:

一种基于分布式图数据库的图遍历算法,包括以下步骤:

步骤A:计算节点向主节点发送图遍历请求,主节点向其余从节点广播该图遍历请求;

步骤B:从节点收到图遍历请求后,从符合条件的起始节点开始遍历自身存储的所有节点,得到本从节点符合筛选条件的NodeIDs,如果没有符合条件的起始节点,则该从节点的JobMaster本地任务完成;

步骤C:在上述步骤B中,如果遍历出存储于其他从节点的节点,则将该节点存储至图遍历路由表,并将图遍历路由表发送至目标节点,得到该从节点中符合筛选条件的NodeIDs;如果没有遍历出储存于其他存储节点的节点,则该从节点向上级的Root汇报完成信息。

步骤D:Root收到完成信息后,本Root任务完成,并向JobMaster汇报,JobMaster收到全部Root任务,且本地遍历任务全部完成,向计算节点汇报任务执行完毕。

采用上述方案,能够让图遍历操作下沉至存储层,减少计算层在查询过程中和存储层频繁的网络通信的开销,通过该种完整的跨存储节点的图遍历算法,能够很好地支撑存储节点内的本地执行和存储节点间的请求转发,不需要依赖于计算节点的同步,有效降低计算节点中的开销。

所述步骤A的具体步骤为:

步骤A1:主节点收到计算节点的图遍历请求后创建TraversalTask对象,并将TraversalTask对象的类型设定为JobMaster,并创建与从节点内Partition数量对应的用于进行图遍历的Worker。

步骤A2:上述JobMaster向其他的从节点广播图遍历请求:

步骤A3:从节点收到上述图遍历请求后创建各自TraversalTsak对象和Worker,并将TraversalTask对象的类型设定为Root。

所述Worker消费完自身的待遍历表的当前最大剩余跳数的数据后,主动窃取其他Worker当前最大剩余跳数的数据来执行圈层遍历。

采用上述方案,通过该种多线程间任务自平衡策略,优化了存储节点的图遍历圈层执行模型,能够最大限度地发挥多核CPU的能力。

所述步骤B的具体步骤为:

步骤B1:从节点的TraversalTask对象根据自身类型,使用反序列化规则解析并维护图遍历上下文;

步骤B2:当TraversalTask对象的类型为JobMaster或Root,每个Worker调用“节点属性过滤”函数,上述“节点属性过滤”函数的内部实现为:后序遍历图遍历上下文的某圈层节点的条件表达式树,完成该从节点内所有节点的访问,并得到符合条件的起始节点;

步骤B3:每个Worker调用“获得出边”函数,并得到上述起始节点对应的EdgeIDs;

步骤B4:每个Worker调用“对边集合进行属性过滤”函数,并得到符合条件的EdgeIDs,与作为输入的EdgeIDs取交集,产生结果EdgeID;

步骤B5:每个Worker调用“获得目的节点”函数,得到上述EdgeIDs对应的NodeIDs。

步骤B6:对得到的NodeIDs进行属性过滤,并产生结果NodeIDs。

所述步骤B5的具体步骤为:每个Worker调用“对节点集合进行属性过滤”函数,其中“对节点集合进行属性过滤”函数的内部实现是:后续遍历图遍历上下文的某圈层节点的条件表达式树,检索属性索引得到符合条件的NodeIDs,与作为输入的NodeIDs取交集,得到符合筛选条件的NodeIDs。

所述步骤C的具体步骤为:

步骤C1:根据NodeID的前缀判断该Node是否位于当前存储节点,如果位于其他节点,则将该Node写入图遍历路由表,如果位于本地存储节点且未重复,则写入待遍历表;

步骤C2:完成步骤B后,检查图遍历路由表,如果图遍历路由表不为空,则序列化图遍历上下文与图遍历路由表,转发至目的从节点,并建立下级存储节点任务完成的统计表,等待下级存储节点的任务完成信息;

步骤C3:目的从节点收到上述图遍历路由请求,构建TraversalTask并标示为UnRoot;

步骤C4:目的从节点解析上述图遍历路由表,并在目的从节点中完成上述步骤B,得到目的从节点中的NodeIDs。

所述步骤D的具体步骤为:

步骤D1:当Root和UnRoot的数个Worker任务完成,也均收到图遍历路由任务的完成消息后,向父TraversalTask回复任务完成。

步骤D2:当JobMaster的多个Worker任务完成,并且也均收到图遍历路由任务完成消息后,且收齐所有类型为Root的完成消息,向计算节点回复任务完成。

所述步骤D1的具体步骤为:

步骤D11:每个Worker以结果容器内的每一个NodeID作为输入,调用“获取节点实例”函数,“获取节点实例”函数的内部实现是:根据NodeID所在的Partition,调用该分区的RocksDB实例的接口,获取节点实例,全部获取完成后,将节点实例发送给计算节点;

步骤D12:TraversalTask统计已完成遍历任务的Worker的个数,如果该Worker的全部任务已完成,则销毁该Worker,并统计完成全部任务的Worker的数量。

在进行所述步骤B时,TraversalTask对象的每一圈层预设用于去重的位图,Work在执行一侧expand操作后,先检查当前圈层的位图中该NodeID的标志位是否为1,若为1,则说明其他Worker已经expand到该节点,本Worker不在当前圈层重复添加该节点,若为0,则将位图的NodeID的bit位原子地置为1,然后将该NodeID加入下一级待遍历表。

采用上述方案,能够实现层次化节点去重策略,在图遍历的执行过程中,能够无锁地去除每一重复节点,减少后续遍历的数据量。

所述步骤B3中的“获得出边”函数的内部实现是:查询图拓扑

采用上述方案,能够带来的有益效果为:

通过将完成的图遍历请求下推到存储层,包括各个节点的访问和过滤、起始节点的筛选,均能够在存储层完成,极大降低了传统技术中图遍历过程计算层与存储层之间的网络通信开销,缓解了计算节点与存储节点之间的网络I/O效率对分布式图数据库的性能较大的影响。

附图说明

此处所说明的附图用来提供对本发明实施例的进一步理解,构成本申请的一部分,并不构成对本发明实施例的限定。在附图中:

图1为本算法的整体架构图;

图2为任一存储节点内的图遍历流程;

图3为图遍历路由流程图。

具体实施方式

为使本发明的目的、技术方案和优点更加清楚明白,下面结合实施例和附图,对本发明作进一步的详细说明,本发明的示意性实施方式及其说明仅用于解释本发明,并不作为对本发明的限定。

实施例1

本实施例1提供一种基于分布式图数据库的图遍历算法,如图1-图3所示,在本实施例中,分布式图数据库集群具体有一个网关服务节点、一个查询控制节点、一个元数据服务节点、四个计算节点、四个存储节点。其中每个存储节点内有四个Partition,上述Partition为存储节点内的存储分区,有四个Partition即为在每个存储节点内有四个存储分区。

在上述四个计算节点中的一个计算节点经查询计划,生成并执行算子下沉至存储节点,设定为三跳查询(n1->n2->n3->n4),并将查询算子序列化。完成序列化后进行主节点查询,具体为向元数据服务器询问当前负载相对较小的存储节点,元数据服务器相应请求并将该存储节点序号告知给计算节点,该存储节点作为本次查询的Master存储节点,即为步骤B中的主节点。随后计算节点向主节点发送序列化后的查询信息和图遍历请求。

主节点收到计算节点的图遍历请求后,构建JobMaster任务,并向其它三个从节点广播本次查询任务,其它三个从节点收到主节点的查询请求,分别构建Root任务。每个存储节点收到图遍历请求后,反序列化解析图遍历请求,在本实施例中查询信息为:

n1:姓名=王五And年龄=24;

e1:follow;

n2:(无限制);

e2:follow;

n3:(无限制);

e3:follow;

n4:姓名=张三Or姓名=李四;

其中n1、n2、n3、n4为节点内的四个分区,在n1内需要获得一个起始节点,在本实施例中,“姓名=王五And年龄=24”即为起始节点的属性要求。在本实施例中,e1、e2、e3的属性要求均为follow。对于JobMaster任务和Root任务,它们是从n1开始遍历。如果JobMaster的四个Worker并没有过滤出符合条件n1,那么JobMaster本地任务完成,并等待三个Root任务的相应完成。其中两个Root同样没有在本地找到符合条件的n1,随即向JobMaster报告任务完成。JobMaster收到任务完成的汇报消息后,记录下已完成的Root任务,还剩下最后一个Root,则继续等待最后一个Root的完成消息。

最后一个Root中的一个Worker过滤出姓名=王五And年龄=24的n1有NodeID1,并将该NodeID1填入该Worker的待遍历表,如表1所示。

表1第一次更新后的待遍历表

Worker调用“获得出边”函数得到NodeID1的出边,分别为Edge1、Edge10和Edge11,其中“获得出边”函数的内部实现为:查询拓扑,即得到NodeID1的对应出边序号EdgeID1、EdgeID10和EdgeID11。

得到出边后,Worker调用“对边集合进行属性过滤”函数,“对边集合进行过滤”函数的内部实现是:后续遍历图遍历上下文和某一条的条件表达式树,检索属性索引得到符合条件的EdgeID,与作为输入的EdgeID取交集,产生结果EdgeID。通过该步骤,过滤出label为follow的出边为EdgeID1和EdgeID10。

上述两个出边EdgeID1和EdgeID10对应的节点序号为NodeID2、NodeID3和NodeID4,由于n2的过滤条件为空,则不进行过滤,将NodeID2、NodeID3和NodeID4进行位图去重检查,发现均不重复;将NodeID2、NodeID3和NodeID4进行是否位于本地检查,发现均位于本地,则n2有NodeID2、NodeID3和NodeID4,并将上述节点填入待遍历表。更新后的待遍历表如表2所示。

表2第二次更新后的待遍历表

Worker通过调用上述“获得出边”函数获得NodeID2、NodeID3和NodeID4的出边为Edge12、Edge13、Edge14,Worker调用上述“对边集合进行属性过滤”函数,查得label为follow的出边为Edge12和Edge13,Edge12和Edge13对应的节点为NodeID5和NodeID6,由于n3的过滤条件为空,不进行对节点的过滤,将NodeID5和NodeID6进行位图去重检查,发现均不重复;将NodeID5和NodeID6进行是否位于本地检查,发现都位于NodeID5位于本地,NodeID6位于另一个从节点,于是NodeID5写入待遍历表的n3位置,更新后的待遍历表如表3所示。将NodeID6写入图遍历路由表。

表3第三次更新后的待遍历表

Worker获得NodeID5的出边为Edge15,边Edge15对应的目的节点为NodeID7,Worker调用“对节点集合进行属性过滤”函数,由于本次得到的目的节点只有NodeID7,则只对NodeID7进行属性过滤,其中“对节点集合进行属性过滤”函数的内部实现是:后续遍历图遍历上下文某圈层节点的调价表达式树,检索属性索引得到符合条件的NodeIDs,与作为输入的NodeIDs取交集,产生结果NodeIDs。在本实施例中n4的属性条件为姓名=张三Or姓名=李四。经过过滤,NodeID7的属性为姓名=张三Or姓名=李四。将NodeID7进行位图去重检查,发现在本从节点内均不重复;将NodeID7进行是否位于本地检查,发现位于本地,于是将NodeID7写入n4,并更新待遍历表,更新后的待遍历表如表4所示。

表4第四次更新后的待遍历表

此时NodeID7为最终的本地结果节点的ID,从对应的Partition获得该节点,然后将该节点发送至计算节点。检查图遍历路由表,发现图遍历路由表不为空,则进行路由转发。

上述NodeID6位于其他节点,该节点称为目标节点,并在该目标节点生成UnRoot任务,反序列化并构建待遍历表,重复完成上述行为,直到目标节点的遍历完成。如果无上述路由任务,则向上级汇报完成。

Root任务收到汇报后,本Root任务完成,向JobMaster汇报,JobMaster至此收到全部Root任务,且本地遍历任务已全部完成,于是向计算节点汇报任务执行完毕。

在上述查询到NodeID后,可能其他Worker已经访问并记录了该NodeID,从而使存储节点的Worker重复访问该节点,造成出现数据冗余。针对该种技术缺陷,本实施例中进行了对数据的去重,即在TraversalTask对象的每一圈层预设一张位图用于去重。其具体为,每个Worker在执行一次扩展操作后,要先检查当前圈层的位图中该NodeID的标志位是否为1.若为1,则说明其他Worker已经扩展到该节点,本Worker不必在当前圈层重复添加该节点,避免后续遍历中发生更大的数据冗余。若该NodeID的标志位为0,则将位图的NodeID的标志位置为1,然后将NodeID加入下一级待遍历表或图遍历路由表。在所有Worker的任务完成后,销毁所有Worker,并统计完成全部任务的Worker数量。在本实施例中,主节点和从节点均为存储节点。

以上所述的具体实施方式,对本发明的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本发明的具体实施方式而已,并不用于限定本发明的保护范围,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

相关技术
  • 一种基于分布式图数据库的图遍历算法
  • 一种基于RRT的栅格地图遍历算法
技术分类

06120114718230