一种基于双队列模型的异步图计算实现方法及系统与流程

文档序号:11589981阅读:136来源:国知局

本发明属于云计算领域,具体涉及一种用于图计算系统的基于双队列模型的异步计算方法及系统。



背景技术:

近年来,以社交网络图、网页链接关系图为代表的图结构数据的数量和规模快速地增长,越来越多的互联网公司开始使用图计算系统对图数据进行分析和计算。现有图计算系统包括pregel、giraph、seraph、bagel等。这些图计算系统均使用了基于内存的分布式数据存储方式、面向顶点的编程模型以及bsp(bulksynchronousparallel)同步计算模型。它们从分布式存储系统中读取图结构数据,在内存中完成迭代计算并将计算结果输出到分布式存储系统中。

这些图系统在进行一次图计算任务时,将计算过程划分成若干个超步(superstep)。在每一个超步中,每个图顶点按照用户提供的算法,处理相邻图顶点在上一个超步发送来的消息、改变顶点自身的状态并向后继顶点发送在下一个超步使用的消息。这种面向顶点、基于消息传递的编程模型使得图计算任务的计算负载可以相对容易地被分布到大量的机器上,从而实现具有高可扩展性的分布式计算。

现有的基于bsp同步计算模型的图系统(同步图系统)存在三个主要问题:

第一、瓶颈节点问题。每一个超步的执行时间取决于运行速度最慢的一台机器。而集群内机器的计算性能及机器间的网络带宽通常是异构的,这导致总会有少数机器(瓶颈节点)完成一个超步的时间显著地长于平均水平,从而造成大量时间及计算资源的浪费。

第二、图计算收敛速度慢的问题。常见的图算法,比如求解单源最短路经、弱连通分量、pagerank等算法,在它们的计算过程的后期,每一个超步只有很少图顶点参与计算(长尾现象),这时在机器间保持超步一致所需的开销变得很大,这严重地拖慢了图计算的速度。

第三、内存占用大的问题。每一个超步中所有顶点产生的消息需要被一直存储在内存中,等待在下一个超步被使用,这需要消耗大量的机器内存资源。



技术实现要素:

为了解决同步图系统的瓶颈节点、收敛速度慢、内存占用大等问题,提高图计算系统的速度并降低其内存消耗,本发明提出一种用于图计算系统的基于双队列模型的异步计算方法,及采用该方法的图计算系统,能够使图计算过程不再受到瓶颈节点的影响,解决长尾现象造成的时间损失,提高图计算系统的速度并降低其内存消耗。

为实现上述目的,本发明采用的技术方案如下:

一种基于双队列模型的异步图计算方法,其步骤包括:

1)在图系统中设置compute、generate和should_generate三个方法的编程接口,用户通过实现该接口来描述将要在图系统上运行的图算法。用户使用该接口描述一个图算法的具体过程如下:

首先,用户与使用传统基于面向顶点的编程模型的图系统时相同,将一个图算法描述为图顶点之间通过发送自定义的消息相互通信、图顶点根据接收的消息改变自身状态并发出新消息的一个迭代式的计算过程;

然后,用户对一个图顶点根据接收的消息改变自身状态并发出新消息的这一过程进行描述,将根据接收到的消息改变自身状态部分的算法逻辑实现为本发明的编程接口中的compute方法,并将这一部分的算法逻辑定义为图顶点的“计算状态”过程;将根据图顶点新的自身状态决定该图顶点是否要向其他图顶点发送新消息部分的算法逻辑实现为should_generate方法,并将图计算中should_generate方法返回值为真的图顶点定义为正在处于“激活状态”的图顶点;将根据图顶点新的自身状态向其他图顶点发送新消息部分的算法逻辑实现为generate方法,并将这一部分的算法逻辑定义为图顶点的“产生消息”过程。更详细的介绍如何通过实现本发明的编程接口来描述一个图算法的指导说明可以在本发明系统的用户手册中找到。

至此,用户完成了通过实现本发明的编程接口描述要运行的图算法。图系统通过调用用户实现的接口中的方法,令图顶点之间相互发送消息和改变图顶点的状态,进行迭代式的图计算。

2)在图系统的每个计算节点中,设置消息队列(messagequeue),用来存储将被用于该计算节点中的图顶点进行的计算状态过程的消息,消息由其他图顶点进行的产生消息过程产生,每条消息包含一个来源图顶点序号、一个目标图顶点序号以及一份由用户提供的generate方法决定取值、由用户提供的compute方法决定对其处理方式的消息内容;设置激活顶点队列(activevertexqueue),用来存储该计算节点中的即将进行产生消息过程的图顶点序号。

3)在图计算过程中,所有计算节点持续并同时地进行以下两种操作:一、计算节点从自身的消息队列中取出一条消息,然后令该消息的目标图顶点进行一次计算状态过程(计算节点对该图顶点调用一次用户提供的compute方法),如果一个顶点在进行此过程后进入激活状态(计算节点对该图顶点调用一次用户提供的should_generate方法,并且该方法返回值为true),则将该顶点的序号加入计算节点自身的激活顶点队列中;二、计算节点从自身的激活顶点队列中取出一个图顶点序号,令图顶点序号对应的图顶点进行一次产生消息过程(计算节点对该图顶点调用一次用户提供的generate方法),并将此消息产生过程产生的发往其他图顶点的消息加入消息的目标图顶点所在计算节点的消息队列中。当图系统内的所有计算节点的消息队列和激活顶点队列均为空时,控制节点判断图计算过程终止,此时所有图顶点的状态即为本次图计算过程的结果。

进一步地,对于步骤1)中所描述的、按照步骤3)中规则被调用的两个过程,对于一个图顶点v,v所在的计算节点workerv分别执行的操作如下:

a)在顶点v的计算状态过程中,workerv使用用户提供的compute方法,利用一条发送给v的消息m,将v的顶点状态由原状态s更新至新状态s′(状态的值及其含义由用户提供的图算法设置和解释),即执行s′←compute(v,s,m);计算节点workerv然后使用用户提供的should_generate方法,判断s′是否会令v进入激活状态,即判断should_generate(v,s′)是否为真,如果为真则s′会令v进入激活状态。其中,一个图顶点处于激活状态意味着,该图顶点v在本次计算状态过程结束之后,在整个图计算过程终止之前,workerv需要令其进行至少一次产生消息过程。

b)在顶点v的产生消息过程中,workerv使用用户提供的generate方法,利用v的顶点状态s,产生v发送给v的后继顶点集合γv的、由图算法决定的消息集合mv,并将v的顶点状态由原状态s更新至新状态s′,即执行s′,mv←generate(v,s);workerv然后令v进入非激活状态。顶点v的后继顶点集合是图结构数据的一部分,是v的自身属性。举例如网页链接关系图中,一个网页v的后继顶点集合是该网页链接指向的网页集合。该信息是图系统读入数据的一部分。消息集合是generate方法的返回结果之一。

进一步地,步骤3)中,在一次图计算过程的最初时刻,对于每一个图顶点v,v所在的计算节点workerv使用用户根据图结构数据和具体的图算法提供的图顶点初始状态s0和should_generate方法,判断v是否处于激活状态,即should_generate(v,s0)是否为真,如果是的话则将v的序号加入workerv的激活顶点队列中。

一种采用上述方法的图计算系统,包括一个控制节点、多个计算节点和一个分布式存储系统。其中,控制节点负责接收用户提交的计算任务、控制计算过程的启动和终止以及监控计算节点的状态;计算节点负责在内存中存储图结构数据、存储消息队列和激活顶点队列、完成具体的计算过程;分布式存储系统负责存储输入数据和输出结果。

与现有技术相比,本发明的积极效果为:

本发明的基于双队列模型的异步图计算方法,通过包含计算状态、产生消息两个过程的编程模型、基于消息队列和激活顶点队列的双队列模型,实现了一种高效的异步图计算方法,消除了同步图计算中瓶颈节点和长尾现象带来的时间损耗,降低了在超步间存储消息带来的内存占用,大幅度提高了图计算系统的性能,是一个精确、细致的方法,实现复杂度低,易于维护,具有较高的实用价值。

附图说明

图1是图计算系统结构示意图。

图2是本发明系统与其他图计算系统的计算时间对比图。

图3是本发明系统与其他图计算系统的内存占用对比图。

具体实施方式

下面通过具体实施例和附图,对本发明做进一步说明。

传统的基于bsp同步计算模型的图计算系统在计算过程中,每个图顶点只有当收集齐它的所有前驱顶点向它发送的消息后才能进行一次计算过程。本发明通过基于双队列模型的异步图计算方法移除了这一特性,进而消除了同步图计算系统中瓶颈节点和长尾现象带来的时间损耗,降低了存储消息带来的内存占用,从而大幅度提高了图系统的性能。

1.基于计算状态、产生消息两个过程的编程模型

本发明在图计算过程中不要求图顶点收集齐它的所有前驱顶点向它发送的消息后才能进行计算过程。为了实现这一目标,本发明将图系统向上层应用提供的编程模型表达为包含计算状态和产生消息两个过程的模型。用户通过实现一个包含以下三个方法的接口来描述一个图算法:

scompute(vvertex,sstatus,mmessage),根据图顶点收到的消息更新图顶点自身状态,其中vvertex是图顶点的静态结构信息,sstatus是图顶点的当前状态,mmessage是图顶点收到的一条消息,返回值s是图顶点在此次计算状态过程结束后的新状态;

<s,list<m>>generate(vvertex,sstatus),根据图顶点的当前状态令其向其后继顶点集合发送消息,其中vvertex是图顶点的静态结构信息,sstatus是图顶点的当前状态,返回值中s是图顶点在此次产生消息过程结束后的新状态,list<m>是包含图顶点要在此次产生消息过程中向其他图顶点发送的所有消息的列表;

booleanshould_generate(vvertex,sstatus),根据图顶点的当前状态决定是其否需要发送消息,其中vvertex是图顶点的静态结构信息,sstatus是图顶点的当前状态,需要发送消息则返回值为真,否则为假。

经过验证,绝大多数运行于图计算系统上的算法都适用于此接口。作为实例,下文给出了两个典型图算法pagerank和sssp(单元最短路经)在此编程模型下的算法实现示例。

a)pagerank算法在本发明的编程模型下的实现示例:

b)sssp算法在本发明的编程模型下的实现示例:

对于计算状态和产生消息两个过程,对于一个图顶点v,v所在的计算节点workerv分别执行的操作如下:

1)在顶点v的计算状态过程中,workerv使用用户提供的compute方法,利用一条发送给v的消息m,将v的顶点状态由s更新至s′,即执行s′←compute(v,s,m);workerv然后使用用户提供的should_generate方法,判断s′是否会令v进入激活状态,即判断should_generate(v,s′)是否为真。

其中,顶点v处于激活状态是指,顶点v在本次计算状态过程结束之后、在整个图计算过程终止之前,需要进行至少一次产生消息过程。

2)在顶点v的产生消息过程中,workerv使用用户提供的generate方法,利用v的顶点状态s,产生v发送给v的后继顶点集合γv的消息集合mv,并将v的顶点状态由s更新至s′,即执行s′,mv←generate(v,s);workerv然后令v进入非激活状态。

2.基于消息队列、激活顶点队列的双队列模型

在图系统的每个计算节点中,设置消息队列(messagequeue),用来存储将被用于计算状态过程的消息;设置激活顶点队列(activevertexqueue),用来存储即将进行产生消息过程的图顶点序号。

其中,将激活顶点队列设定为不包含重复元素的lru(leastrecentlyused)队列。不包含重复元素的队列使得一个图顶点在短时间内收到多条消息并进行多次计算状态过程后可以只进行一次产生消息过程,减少了冗余的产生消息过程。lru队列选择出在未来短时间内有更小可能收到消息并进行计算状态过程的图顶点来进行产生消息过程,同样地减少了冗余的产生消息过程。

3.图计算过程

1)在图计算开始时,对于每一个图顶点v,v所在的计算节点workerv从下层分布式存储系统读取图顶点初始状态s0,判断v是否处于激活状态,即should_generate(v,s0)是否为真,如果是的话则将v的序号加入workerv的激活顶点队列中。

2)在图计算过程中,计算节点从自身的消息队列中取出消息,令该消息的目标顶点进行一次计算状态过程,如果一个顶点在进行此过程后进入激活状态,则将该顶点的序号加入计算节点自身的激活顶点队列中;同时地,计算节点从自身的激活顶点队列中取出图顶点序号,令序号对应的图顶点进行一次产生消息过程,并将此过程产生的消息加入消息的目标顶点所在计算节点的消息队列中。所有计算节点持续进行以上两种操作,进行图计算过程。

3)当图计算过程中,图系统内的所有计算节点的消息队列和激活顶点队列均为空时,图计算过程终止。由于计算节点各自的时钟存在差异,并且节点间通信存在一定延迟,因此图计算终止检测过程如下:

3a)在图计算过程中,所有计算节点以固定的时间间隔t1向控制节点发送三元组(mq_leni,k,avq_leni,k,has_changedi,k)。其中,mq_leni,k为第i个计算节点第k次发送三元组时自身的消息队列的长度;avq_leni,k为第i个计算节点第k次发送三元组时自身的激活顶点队列的长度,has_changedi,k表示第i个计算节点在第k-1次发送三元组与第k次发送三元组之间的时间范围内自身的两个队列的长度是否发生过变化,并额外规定has_changedi,1≡true,因为当k=1时,has_changed的定义中“第k-1次发送三元组”无意义,因此额外规定此式,从而当判断下文的条件3b2)时,系统可以正确地处理一个计算节点从计算开始至结束其上的两个队列长度始终保持为0的情况。

3b)控制节点存储所有计算节点发送给它的三元组,以及每次收到三元组时控制节点的本地时间。如果控制节点在接收到任意一个三元组的时候,发现下述条件3b1)和条件3b2)均成立,那么控制节点判断图计算过程终止,并向所有计算节点发送图计算过程终止的通知:

3b1)

其中,n为计算节点数目,mi为控制节点在本次图计算过程中,从第i个计算节点接收的三元组的数目;

3b2)其中ti,k为控制节点从第i个计算节点接收到第k个三元组时的本地时间,pi满足

,t2为常数。

条件3b1)和条件3b2)均成立的含义是,控制节点在计算过程中找到了一个长度大于t2的连续时间段——所有计算节点都向控制节点保证在此时间段内,自己的两个队列的长度一直保持为0不变;并且没有计算节点向控制节点汇报,在此时间段之后,自己的两个队列的长度发生过变化。

以下详细介绍针对本发明方法所进行的实验。该实验完整地实现了前文所述的基于双队列模型的异步图计算系统,并使用真实的图数据和常见图算法作为任务负载,并与传统同步图计算系统比较,以测量此方法的性能。

1)实施步骤

a)首先实现所需的图计算系统,其系统结构如图1所示。

该系统包含一个控制节点(master)以及多个计算节点(worker)。其中,控制节点负责接收用户提交的计算任务、控制计算过程的启动和终止以及监控计算节点的状态;计算节点负责在内存中存储图结构数据、存储消息队列和激活顶点队列、完成具体的计算过程。节点间使用与seraph类似的apachemina通信框架进行消息通信。系统从分布式存储系统读取输入数据并向其输出计算结果。

b)启动系统,向系统提交计算任务,计算节点从分布式存储系统读取图数据并在控制节点的控制下开始计算。当控制节点检测到图计算过程终止时,向计算节点发送计算终止消息,计算节点将计算结果输出至分布式存储系统中。

2)实施效果

实验使用15台服务器,每台服务器的配置为12核amdopteron4180和48gb内存,操作系统为suselinuxsp164bit,jvm版本为oraclejre7update25,服务器之间使用千兆网络连接。实验所用的图数据为2007年uk顶级域名下域名间的网页链接关系数据,共约1亿顶点以及37亿条边,图的平均度数约为37。下层分布式存储系统采用hdfs1.1.2。使用同步图计算系统giraph、seraph作为性能对照。

实验采用两个图计算领域的典型算法作为计算负载:pagerank和sssp,并根据本发明方法的需求针对每个算法实现了相应的compute和generate等函数。所有系统和算法均使用java1.7实现。

图2展示了本发明的实验系统、giraph系统和seraph系统在几个典型图计算任务下的运行时间。由于本发明中基于双队列模型的异步图计算方法的加入,实验系统的运行时间大大短于现有系统。对于pagerank算法和sssp算法,实验系统的运行时间只有seraph系统的11%和14%,只有giraph系统的4%和18%。

图3展示了本发明的实验系统、giraph系统和seraph系统在几个典型图计算任务下的运行时内存占用。由于本发明中基于双队列模型的异步图计算方法的加入,实验系统的内存占用小于现有系统。对于pagerank算法和sssp算法,实验系统的内存占用只有seraph系统的59%和65%,只有giraph系统的49%和66%。

以上实施例仅用以说明本发明的技术方案而非对其进行限制,本领域的普通技术人员可以对本发明的技术方案进行修改或者等同替换,而不脱离本发明的精神和范围,本发明的保护范围应以权利要求所述为准。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1