本發(fā)明屬于云計(jì)算領(lǐng)域,具體涉及一種用于圖計(jì)算系統(tǒng)的基于雙隊(duì)列模型的異步計(jì)算方法及系統(tǒng)。
背景技術(shù):
近年來(lái),以社交網(wǎng)絡(luò)圖、網(wǎng)頁(yè)鏈接關(guān)系圖為代表的圖結(jié)構(gòu)數(shù)據(jù)的數(shù)量和規(guī)??焖俚卦鲩L(zhǎng),越來(lái)越多的互聯(lián)網(wǎng)公司開(kāi)始使用圖計(jì)算系統(tǒng)對(duì)圖數(shù)據(jù)進(jìn)行分析和計(jì)算。現(xiàn)有圖計(jì)算系統(tǒng)包括pregel、giraph、seraph、bagel等。這些圖計(jì)算系統(tǒng)均使用了基于內(nèi)存的分布式數(shù)據(jù)存儲(chǔ)方式、面向頂點(diǎn)的編程模型以及bsp(bulksynchronousparallel)同步計(jì)算模型。它們從分布式存儲(chǔ)系統(tǒng)中讀取圖結(jié)構(gòu)數(shù)據(jù),在內(nèi)存中完成迭代計(jì)算并將計(jì)算結(jié)果輸出到分布式存儲(chǔ)系統(tǒng)中。
這些圖系統(tǒng)在進(jìn)行一次圖計(jì)算任務(wù)時(shí),將計(jì)算過(guò)程劃分成若干個(gè)超步(superstep)。在每一個(gè)超步中,每個(gè)圖頂點(diǎn)按照用戶提供的算法,處理相鄰圖頂點(diǎn)在上一個(gè)超步發(fā)送來(lái)的消息、改變頂點(diǎn)自身的狀態(tài)并向后繼頂點(diǎn)發(fā)送在下一個(gè)超步使用的消息。這種面向頂點(diǎn)、基于消息傳遞的編程模型使得圖計(jì)算任務(wù)的計(jì)算負(fù)載可以相對(duì)容易地被分布到大量的機(jī)器上,從而實(shí)現(xiàn)具有高可擴(kuò)展性的分布式計(jì)算。
現(xiàn)有的基于bsp同步計(jì)算模型的圖系統(tǒng)(同步圖系統(tǒng))存在三個(gè)主要問(wèn)題:
第一、瓶頸節(jié)點(diǎn)問(wèn)題。每一個(gè)超步的執(zhí)行時(shí)間取決于運(yùn)行速度最慢的一臺(tái)機(jī)器。而集群內(nèi)機(jī)器的計(jì)算性能及機(jī)器間的網(wǎng)絡(luò)帶寬通常是異構(gòu)的,這導(dǎo)致總會(huì)有少數(shù)機(jī)器(瓶頸節(jié)點(diǎn))完成一個(gè)超步的時(shí)間顯著地長(zhǎng)于平均水平,從而造成大量時(shí)間及計(jì)算資源的浪費(fèi)。
第二、圖計(jì)算收斂速度慢的問(wèn)題。常見(jiàn)的圖算法,比如求解單源最短路經(jīng)、弱連通分量、pagerank等算法,在它們的計(jì)算過(guò)程的后期,每一個(gè)超步只有很少圖頂點(diǎn)參與計(jì)算(長(zhǎng)尾現(xiàn)象),這時(shí)在機(jī)器間保持超步一致所需的開(kāi)銷(xiāo)變得很大,這嚴(yán)重地拖慢了圖計(jì)算的速度。
第三、內(nèi)存占用大的問(wèn)題。每一個(gè)超步中所有頂點(diǎn)產(chǎn)生的消息需要被一直存儲(chǔ)在內(nèi)存中,等待在下一個(gè)超步被使用,這需要消耗大量的機(jī)器內(nèi)存資源。
技術(shù)實(shí)現(xiàn)要素:
為了解決同步圖系統(tǒng)的瓶頸節(jié)點(diǎn)、收斂速度慢、內(nèi)存占用大等問(wèn)題,提高圖計(jì)算系統(tǒng)的速度并降低其內(nèi)存消耗,本發(fā)明提出一種用于圖計(jì)算系統(tǒng)的基于雙隊(duì)列模型的異步計(jì)算方法,及采用該方法的圖計(jì)算系統(tǒng),能夠使圖計(jì)算過(guò)程不再受到瓶頸節(jié)點(diǎn)的影響,解決長(zhǎng)尾現(xiàn)象造成的時(shí)間損失,提高圖計(jì)算系統(tǒng)的速度并降低其內(nèi)存消耗。
為實(shí)現(xiàn)上述目的,本發(fā)明采用的技術(shù)方案如下:
一種基于雙隊(duì)列模型的異步圖計(jì)算方法,其步驟包括:
1)在圖系統(tǒng)中設(shè)置compute、generate和should_generate三個(gè)方法的編程接口,用戶通過(guò)實(shí)現(xiàn)該接口來(lái)描述將要在圖系統(tǒng)上運(yùn)行的圖算法。用戶使用該接口描述一個(gè)圖算法的具體過(guò)程如下:
首先,用戶與使用傳統(tǒng)基于面向頂點(diǎn)的編程模型的圖系統(tǒng)時(shí)相同,將一個(gè)圖算法描述為圖頂點(diǎn)之間通過(guò)發(fā)送自定義的消息相互通信、圖頂點(diǎn)根據(jù)接收的消息改變自身狀態(tài)并發(fā)出新消息的一個(gè)迭代式的計(jì)算過(guò)程;
然后,用戶對(duì)一個(gè)圖頂點(diǎn)根據(jù)接收的消息改變自身狀態(tài)并發(fā)出新消息的這一過(guò)程進(jìn)行描述,將根據(jù)接收到的消息改變自身狀態(tài)部分的算法邏輯實(shí)現(xiàn)為本發(fā)明的編程接口中的compute方法,并將這一部分的算法邏輯定義為圖頂點(diǎn)的“計(jì)算狀態(tài)”過(guò)程;將根據(jù)圖頂點(diǎn)新的自身狀態(tài)決定該圖頂點(diǎn)是否要向其他圖頂點(diǎn)發(fā)送新消息部分的算法邏輯實(shí)現(xiàn)為should_generate方法,并將圖計(jì)算中should_generate方法返回值為真的圖頂點(diǎn)定義為正在處于“激活狀態(tài)”的圖頂點(diǎn);將根據(jù)圖頂點(diǎn)新的自身狀態(tài)向其他圖頂點(diǎn)發(fā)送新消息部分的算法邏輯實(shí)現(xiàn)為generate方法,并將這一部分的算法邏輯定義為圖頂點(diǎn)的“產(chǎn)生消息”過(guò)程。更詳細(xì)的介紹如何通過(guò)實(shí)現(xiàn)本發(fā)明的編程接口來(lái)描述一個(gè)圖算法的指導(dǎo)說(shuō)明可以在本發(fā)明系統(tǒng)的用戶手冊(cè)中找到。
至此,用戶完成了通過(guò)實(shí)現(xiàn)本發(fā)明的編程接口描述要運(yùn)行的圖算法。圖系統(tǒng)通過(guò)調(diào)用用戶實(shí)現(xiàn)的接口中的方法,令圖頂點(diǎn)之間相互發(fā)送消息和改變圖頂點(diǎn)的狀態(tài),進(jìn)行迭代式的圖計(jì)算。
2)在圖系統(tǒng)的每個(gè)計(jì)算節(jié)點(diǎn)中,設(shè)置消息隊(duì)列(messagequeue),用來(lái)存儲(chǔ)將被用于該計(jì)算節(jié)點(diǎn)中的圖頂點(diǎn)進(jìn)行的計(jì)算狀態(tài)過(guò)程的消息,消息由其他圖頂點(diǎn)進(jìn)行的產(chǎn)生消息過(guò)程產(chǎn)生,每條消息包含一個(gè)來(lái)源圖頂點(diǎn)序號(hào)、一個(gè)目標(biāo)圖頂點(diǎn)序號(hào)以及一份由用戶提供的generate方法決定取值、由用戶提供的compute方法決定對(duì)其處理方式的消息內(nèi)容;設(shè)置激活頂點(diǎn)隊(duì)列(activevertexqueue),用來(lái)存儲(chǔ)該計(jì)算節(jié)點(diǎn)中的即將進(jìn)行產(chǎn)生消息過(guò)程的圖頂點(diǎn)序號(hào)。
3)在圖計(jì)算過(guò)程中,所有計(jì)算節(jié)點(diǎn)持續(xù)并同時(shí)地進(jìn)行以下兩種操作:一、計(jì)算節(jié)點(diǎn)從自身的消息隊(duì)列中取出一條消息,然后令該消息的目標(biāo)圖頂點(diǎn)進(jìn)行一次計(jì)算狀態(tài)過(guò)程(計(jì)算節(jié)點(diǎn)對(duì)該圖頂點(diǎn)調(diào)用一次用戶提供的compute方法),如果一個(gè)頂點(diǎn)在進(jìn)行此過(guò)程后進(jìn)入激活狀態(tài)(計(jì)算節(jié)點(diǎn)對(duì)該圖頂點(diǎn)調(diào)用一次用戶提供的should_generate方法,并且該方法返回值為true),則將該頂點(diǎn)的序號(hào)加入計(jì)算節(jié)點(diǎn)自身的激活頂點(diǎn)隊(duì)列中;二、計(jì)算節(jié)點(diǎn)從自身的激活頂點(diǎn)隊(duì)列中取出一個(gè)圖頂點(diǎn)序號(hào),令圖頂點(diǎn)序號(hào)對(duì)應(yīng)的圖頂點(diǎn)進(jìn)行一次產(chǎn)生消息過(guò)程(計(jì)算節(jié)點(diǎn)對(duì)該圖頂點(diǎn)調(diào)用一次用戶提供的generate方法),并將此消息產(chǎn)生過(guò)程產(chǎn)生的發(fā)往其他圖頂點(diǎn)的消息加入消息的目標(biāo)圖頂點(diǎn)所在計(jì)算節(jié)點(diǎn)的消息隊(duì)列中。當(dāng)圖系統(tǒng)內(nèi)的所有計(jì)算節(jié)點(diǎn)的消息隊(duì)列和激活頂點(diǎn)隊(duì)列均為空時(shí),控制節(jié)點(diǎn)判斷圖計(jì)算過(guò)程終止,此時(shí)所有圖頂點(diǎn)的狀態(tài)即為本次圖計(jì)算過(guò)程的結(jié)果。
進(jìn)一步地,對(duì)于步驟1)中所描述的、按照步驟3)中規(guī)則被調(diào)用的兩個(gè)過(guò)程,對(duì)于一個(gè)圖頂點(diǎn)v,v所在的計(jì)算節(jié)點(diǎn)workerv分別執(zhí)行的操作如下:
a)在頂點(diǎn)v的計(jì)算狀態(tài)過(guò)程中,workerv使用用戶提供的compute方法,利用一條發(fā)送給v的消息m,將v的頂點(diǎn)狀態(tài)由原狀態(tài)s更新至新?tīng)顟B(tài)s′(狀態(tài)的值及其含義由用戶提供的圖算法設(shè)置和解釋),即執(zhí)行s′←compute(v,s,m);計(jì)算節(jié)點(diǎn)workerv然后使用用戶提供的should_generate方法,判斷s′是否會(huì)令v進(jìn)入激活狀態(tài),即判斷should_generate(v,s′)是否為真,如果為真則s′會(huì)令v進(jìn)入激活狀態(tài)。其中,一個(gè)圖頂點(diǎn)處于激活狀態(tài)意味著,該圖頂點(diǎn)v在本次計(jì)算狀態(tài)過(guò)程結(jié)束之后,在整個(gè)圖計(jì)算過(guò)程終止之前,workerv需要令其進(jìn)行至少一次產(chǎn)生消息過(guò)程。
b)在頂點(diǎn)v的產(chǎn)生消息過(guò)程中,workerv使用用戶提供的generate方法,利用v的頂點(diǎn)狀態(tài)s,產(chǎn)生v發(fā)送給v的后繼頂點(diǎn)集合γv的、由圖算法決定的消息集合mv,并將v的頂點(diǎn)狀態(tài)由原狀態(tài)s更新至新?tīng)顟B(tài)s′,即執(zhí)行s′,mv←generate(v,s);workerv然后令v進(jìn)入非激活狀態(tài)。頂點(diǎn)v的后繼頂點(diǎn)集合是圖結(jié)構(gòu)數(shù)據(jù)的一部分,是v的自身屬性。舉例如網(wǎng)頁(yè)鏈接關(guān)系圖中,一個(gè)網(wǎng)頁(yè)v的后繼頂點(diǎn)集合是該網(wǎng)頁(yè)鏈接指向的網(wǎng)頁(yè)集合。該信息是圖系統(tǒng)讀入數(shù)據(jù)的一部分。消息集合是generate方法的返回結(jié)果之一。
進(jìn)一步地,步驟3)中,在一次圖計(jì)算過(guò)程的最初時(shí)刻,對(duì)于每一個(gè)圖頂點(diǎn)v,v所在的計(jì)算節(jié)點(diǎn)workerv使用用戶根據(jù)圖結(jié)構(gòu)數(shù)據(jù)和具體的圖算法提供的圖頂點(diǎn)初始狀態(tài)s0和should_generate方法,判斷v是否處于激活狀態(tài),即should_generate(v,s0)是否為真,如果是的話則將v的序號(hào)加入workerv的激活頂點(diǎn)隊(duì)列中。
一種采用上述方法的圖計(jì)算系統(tǒng),包括一個(gè)控制節(jié)點(diǎn)、多個(gè)計(jì)算節(jié)點(diǎn)和一個(gè)分布式存儲(chǔ)系統(tǒng)。其中,控制節(jié)點(diǎn)負(fù)責(zé)接收用戶提交的計(jì)算任務(wù)、控制計(jì)算過(guò)程的啟動(dòng)和終止以及監(jiān)控計(jì)算節(jié)點(diǎn)的狀態(tài);計(jì)算節(jié)點(diǎn)負(fù)責(zé)在內(nèi)存中存儲(chǔ)圖結(jié)構(gòu)數(shù)據(jù)、存儲(chǔ)消息隊(duì)列和激活頂點(diǎn)隊(duì)列、完成具體的計(jì)算過(guò)程;分布式存儲(chǔ)系統(tǒng)負(fù)責(zé)存儲(chǔ)輸入數(shù)據(jù)和輸出結(jié)果。
與現(xiàn)有技術(shù)相比,本發(fā)明的積極效果為:
本發(fā)明的基于雙隊(duì)列模型的異步圖計(jì)算方法,通過(guò)包含計(jì)算狀態(tài)、產(chǎn)生消息兩個(gè)過(guò)程的編程模型、基于消息隊(duì)列和激活頂點(diǎn)隊(duì)列的雙隊(duì)列模型,實(shí)現(xiàn)了一種高效的異步圖計(jì)算方法,消除了同步圖計(jì)算中瓶頸節(jié)點(diǎn)和長(zhǎng)尾現(xiàn)象帶來(lái)的時(shí)間損耗,降低了在超步間存儲(chǔ)消息帶來(lái)的內(nèi)存占用,大幅度提高了圖計(jì)算系統(tǒng)的性能,是一個(gè)精確、細(xì)致的方法,實(shí)現(xiàn)復(fù)雜度低,易于維護(hù),具有較高的實(shí)用價(jià)值。
附圖說(shuō)明
圖1是圖計(jì)算系統(tǒng)結(jié)構(gòu)示意圖。
圖2是本發(fā)明系統(tǒng)與其他圖計(jì)算系統(tǒng)的計(jì)算時(shí)間對(duì)比圖。
圖3是本發(fā)明系統(tǒng)與其他圖計(jì)算系統(tǒng)的內(nèi)存占用對(duì)比圖。
具體實(shí)施方式
下面通過(guò)具體實(shí)施例和附圖,對(duì)本發(fā)明做進(jìn)一步說(shuō)明。
傳統(tǒng)的基于bsp同步計(jì)算模型的圖計(jì)算系統(tǒng)在計(jì)算過(guò)程中,每個(gè)圖頂點(diǎn)只有當(dāng)收集齊它的所有前驅(qū)頂點(diǎn)向它發(fā)送的消息后才能進(jìn)行一次計(jì)算過(guò)程。本發(fā)明通過(guò)基于雙隊(duì)列模型的異步圖計(jì)算方法移除了這一特性,進(jìn)而消除了同步圖計(jì)算系統(tǒng)中瓶頸節(jié)點(diǎn)和長(zhǎng)尾現(xiàn)象帶來(lái)的時(shí)間損耗,降低了存儲(chǔ)消息帶來(lái)的內(nèi)存占用,從而大幅度提高了圖系統(tǒng)的性能。
1.基于計(jì)算狀態(tài)、產(chǎn)生消息兩個(gè)過(guò)程的編程模型
本發(fā)明在圖計(jì)算過(guò)程中不要求圖頂點(diǎn)收集齊它的所有前驅(qū)頂點(diǎn)向它發(fā)送的消息后才能進(jìn)行計(jì)算過(guò)程。為了實(shí)現(xiàn)這一目標(biāo),本發(fā)明將圖系統(tǒng)向上層應(yīng)用提供的編程模型表達(dá)為包含計(jì)算狀態(tài)和產(chǎn)生消息兩個(gè)過(guò)程的模型。用戶通過(guò)實(shí)現(xiàn)一個(gè)包含以下三個(gè)方法的接口來(lái)描述一個(gè)圖算法:
scompute(vvertex,sstatus,mmessage),根據(jù)圖頂點(diǎn)收到的消息更新圖頂點(diǎn)自身狀態(tài),其中vvertex是圖頂點(diǎn)的靜態(tài)結(jié)構(gòu)信息,sstatus是圖頂點(diǎn)的當(dāng)前狀態(tài),mmessage是圖頂點(diǎn)收到的一條消息,返回值s是圖頂點(diǎn)在此次計(jì)算狀態(tài)過(guò)程結(jié)束后的新?tīng)顟B(tài);
<s,list<m>>generate(vvertex,sstatus),根據(jù)圖頂點(diǎn)的當(dāng)前狀態(tài)令其向其后繼頂點(diǎn)集合發(fā)送消息,其中vvertex是圖頂點(diǎn)的靜態(tài)結(jié)構(gòu)信息,sstatus是圖頂點(diǎn)的當(dāng)前狀態(tài),返回值中s是圖頂點(diǎn)在此次產(chǎn)生消息過(guò)程結(jié)束后的新?tīng)顟B(tài),list<m>是包含圖頂點(diǎn)要在此次產(chǎn)生消息過(guò)程中向其他圖頂點(diǎn)發(fā)送的所有消息的列表;
booleanshould_generate(vvertex,sstatus),根據(jù)圖頂點(diǎn)的當(dāng)前狀態(tài)決定是其否需要發(fā)送消息,其中vvertex是圖頂點(diǎn)的靜態(tài)結(jié)構(gòu)信息,sstatus是圖頂點(diǎn)的當(dāng)前狀態(tài),需要發(fā)送消息則返回值為真,否則為假。
經(jīng)過(guò)驗(yàn)證,絕大多數(shù)運(yùn)行于圖計(jì)算系統(tǒng)上的算法都適用于此接口。作為實(shí)例,下文給出了兩個(gè)典型圖算法pagerank和sssp(單元最短路經(jīng))在此編程模型下的算法實(shí)現(xiàn)示例。
a)pagerank算法在本發(fā)明的編程模型下的實(shí)現(xiàn)示例:
b)sssp算法在本發(fā)明的編程模型下的實(shí)現(xiàn)示例:
對(duì)于計(jì)算狀態(tài)和產(chǎn)生消息兩個(gè)過(guò)程,對(duì)于一個(gè)圖頂點(diǎn)v,v所在的計(jì)算節(jié)點(diǎn)workerv分別執(zhí)行的操作如下:
1)在頂點(diǎn)v的計(jì)算狀態(tài)過(guò)程中,workerv使用用戶提供的compute方法,利用一條發(fā)送給v的消息m,將v的頂點(diǎn)狀態(tài)由s更新至s′,即執(zhí)行s′←compute(v,s,m);workerv然后使用用戶提供的should_generate方法,判斷s′是否會(huì)令v進(jìn)入激活狀態(tài),即判斷should_generate(v,s′)是否為真。
其中,頂點(diǎn)v處于激活狀態(tài)是指,頂點(diǎn)v在本次計(jì)算狀態(tài)過(guò)程結(jié)束之后、在整個(gè)圖計(jì)算過(guò)程終止之前,需要進(jìn)行至少一次產(chǎn)生消息過(guò)程。
2)在頂點(diǎn)v的產(chǎn)生消息過(guò)程中,workerv使用用戶提供的generate方法,利用v的頂點(diǎn)狀態(tài)s,產(chǎn)生v發(fā)送給v的后繼頂點(diǎn)集合γv的消息集合mv,并將v的頂點(diǎn)狀態(tài)由s更新至s′,即執(zhí)行s′,mv←generate(v,s);workerv然后令v進(jìn)入非激活狀態(tài)。
2.基于消息隊(duì)列、激活頂點(diǎn)隊(duì)列的雙隊(duì)列模型
在圖系統(tǒng)的每個(gè)計(jì)算節(jié)點(diǎn)中,設(shè)置消息隊(duì)列(messagequeue),用來(lái)存儲(chǔ)將被用于計(jì)算狀態(tài)過(guò)程的消息;設(shè)置激活頂點(diǎn)隊(duì)列(activevertexqueue),用來(lái)存儲(chǔ)即將進(jìn)行產(chǎn)生消息過(guò)程的圖頂點(diǎn)序號(hào)。
其中,將激活頂點(diǎn)隊(duì)列設(shè)定為不包含重復(fù)元素的lru(leastrecentlyused)隊(duì)列。不包含重復(fù)元素的隊(duì)列使得一個(gè)圖頂點(diǎn)在短時(shí)間內(nèi)收到多條消息并進(jìn)行多次計(jì)算狀態(tài)過(guò)程后可以只進(jìn)行一次產(chǎn)生消息過(guò)程,減少了冗余的產(chǎn)生消息過(guò)程。lru隊(duì)列選擇出在未來(lái)短時(shí)間內(nèi)有更小可能收到消息并進(jìn)行計(jì)算狀態(tài)過(guò)程的圖頂點(diǎn)來(lái)進(jìn)行產(chǎn)生消息過(guò)程,同樣地減少了冗余的產(chǎn)生消息過(guò)程。
3.圖計(jì)算過(guò)程
1)在圖計(jì)算開(kāi)始時(shí),對(duì)于每一個(gè)圖頂點(diǎn)v,v所在的計(jì)算節(jié)點(diǎn)workerv從下層分布式存儲(chǔ)系統(tǒng)讀取圖頂點(diǎn)初始狀態(tài)s0,判斷v是否處于激活狀態(tài),即should_generate(v,s0)是否為真,如果是的話則將v的序號(hào)加入workerv的激活頂點(diǎn)隊(duì)列中。
2)在圖計(jì)算過(guò)程中,計(jì)算節(jié)點(diǎn)從自身的消息隊(duì)列中取出消息,令該消息的目標(biāo)頂點(diǎn)進(jìn)行一次計(jì)算狀態(tài)過(guò)程,如果一個(gè)頂點(diǎn)在進(jìn)行此過(guò)程后進(jìn)入激活狀態(tài),則將該頂點(diǎn)的序號(hào)加入計(jì)算節(jié)點(diǎn)自身的激活頂點(diǎn)隊(duì)列中;同時(shí)地,計(jì)算節(jié)點(diǎn)從自身的激活頂點(diǎn)隊(duì)列中取出圖頂點(diǎn)序號(hào),令序號(hào)對(duì)應(yīng)的圖頂點(diǎn)進(jìn)行一次產(chǎn)生消息過(guò)程,并將此過(guò)程產(chǎn)生的消息加入消息的目標(biāo)頂點(diǎn)所在計(jì)算節(jié)點(diǎn)的消息隊(duì)列中。所有計(jì)算節(jié)點(diǎn)持續(xù)進(jìn)行以上兩種操作,進(jìn)行圖計(jì)算過(guò)程。
3)當(dāng)圖計(jì)算過(guò)程中,圖系統(tǒng)內(nèi)的所有計(jì)算節(jié)點(diǎn)的消息隊(duì)列和激活頂點(diǎn)隊(duì)列均為空時(shí),圖計(jì)算過(guò)程終止。由于計(jì)算節(jié)點(diǎn)各自的時(shí)鐘存在差異,并且節(jié)點(diǎn)間通信存在一定延遲,因此圖計(jì)算終止檢測(cè)過(guò)程如下:
3a)在圖計(jì)算過(guò)程中,所有計(jì)算節(jié)點(diǎn)以固定的時(shí)間間隔t1向控制節(jié)點(diǎn)發(fā)送三元組(mq_leni,k,avq_leni,k,has_changedi,k)。其中,mq_leni,k為第i個(gè)計(jì)算節(jié)點(diǎn)第k次發(fā)送三元組時(shí)自身的消息隊(duì)列的長(zhǎng)度;avq_leni,k為第i個(gè)計(jì)算節(jié)點(diǎn)第k次發(fā)送三元組時(shí)自身的激活頂點(diǎn)隊(duì)列的長(zhǎng)度,has_changedi,k表示第i個(gè)計(jì)算節(jié)點(diǎn)在第k-1次發(fā)送三元組與第k次發(fā)送三元組之間的時(shí)間范圍內(nèi)自身的兩個(gè)隊(duì)列的長(zhǎng)度是否發(fā)生過(guò)變化,并額外規(guī)定has_changedi,1≡true,因?yàn)楫?dāng)k=1時(shí),has_changed的定義中“第k-1次發(fā)送三元組”無(wú)意義,因此額外規(guī)定此式,從而當(dāng)判斷下文的條件3b2)時(shí),系統(tǒng)可以正確地處理一個(gè)計(jì)算節(jié)點(diǎn)從計(jì)算開(kāi)始至結(jié)束其上的兩個(gè)隊(duì)列長(zhǎng)度始終保持為0的情況。
3b)控制節(jié)點(diǎn)存儲(chǔ)所有計(jì)算節(jié)點(diǎn)發(fā)送給它的三元組,以及每次收到三元組時(shí)控制節(jié)點(diǎn)的本地時(shí)間。如果控制節(jié)點(diǎn)在接收到任意一個(gè)三元組的時(shí)候,發(fā)現(xiàn)下述條件3b1)和條件3b2)均成立,那么控制節(jié)點(diǎn)判斷圖計(jì)算過(guò)程終止,并向所有計(jì)算節(jié)點(diǎn)發(fā)送圖計(jì)算過(guò)程終止的通知:
3b1)
3b2)
,t2為常數(shù)。
條件3b1)和條件3b2)均成立的含義是,控制節(jié)點(diǎn)在計(jì)算過(guò)程中找到了一個(gè)長(zhǎng)度大于t2的連續(xù)時(shí)間段——所有計(jì)算節(jié)點(diǎn)都向控制節(jié)點(diǎn)保證在此時(shí)間段內(nèi),自己的兩個(gè)隊(duì)列的長(zhǎng)度一直保持為0不變;并且沒(méi)有計(jì)算節(jié)點(diǎn)向控制節(jié)點(diǎn)匯報(bào),在此時(shí)間段之后,自己的兩個(gè)隊(duì)列的長(zhǎng)度發(fā)生過(guò)變化。
以下詳細(xì)介紹針對(duì)本發(fā)明方法所進(jìn)行的實(shí)驗(yàn)。該實(shí)驗(yàn)完整地實(shí)現(xiàn)了前文所述的基于雙隊(duì)列模型的異步圖計(jì)算系統(tǒng),并使用真實(shí)的圖數(shù)據(jù)和常見(jiàn)圖算法作為任務(wù)負(fù)載,并與傳統(tǒng)同步圖計(jì)算系統(tǒng)比較,以測(cè)量此方法的性能。
1)實(shí)施步驟
a)首先實(shí)現(xiàn)所需的圖計(jì)算系統(tǒng),其系統(tǒng)結(jié)構(gòu)如圖1所示。
該系統(tǒng)包含一個(gè)控制節(jié)點(diǎn)(master)以及多個(gè)計(jì)算節(jié)點(diǎn)(worker)。其中,控制節(jié)點(diǎn)負(fù)責(zé)接收用戶提交的計(jì)算任務(wù)、控制計(jì)算過(guò)程的啟動(dòng)和終止以及監(jiān)控計(jì)算節(jié)點(diǎn)的狀態(tài);計(jì)算節(jié)點(diǎn)負(fù)責(zé)在內(nèi)存中存儲(chǔ)圖結(jié)構(gòu)數(shù)據(jù)、存儲(chǔ)消息隊(duì)列和激活頂點(diǎn)隊(duì)列、完成具體的計(jì)算過(guò)程。節(jié)點(diǎn)間使用與seraph類(lèi)似的apachemina通信框架進(jìn)行消息通信。系統(tǒng)從分布式存儲(chǔ)系統(tǒng)讀取輸入數(shù)據(jù)并向其輸出計(jì)算結(jié)果。
b)啟動(dòng)系統(tǒng),向系統(tǒng)提交計(jì)算任務(wù),計(jì)算節(jié)點(diǎn)從分布式存儲(chǔ)系統(tǒng)讀取圖數(shù)據(jù)并在控制節(jié)點(diǎn)的控制下開(kāi)始計(jì)算。當(dāng)控制節(jié)點(diǎn)檢測(cè)到圖計(jì)算過(guò)程終止時(shí),向計(jì)算節(jié)點(diǎn)發(fā)送計(jì)算終止消息,計(jì)算節(jié)點(diǎn)將計(jì)算結(jié)果輸出至分布式存儲(chǔ)系統(tǒng)中。
2)實(shí)施效果
實(shí)驗(yàn)使用15臺(tái)服務(wù)器,每臺(tái)服務(wù)器的配置為12核amdopteron4180和48gb內(nèi)存,操作系統(tǒng)為suselinuxsp164bit,jvm版本為oraclejre7update25,服務(wù)器之間使用千兆網(wǎng)絡(luò)連接。實(shí)驗(yàn)所用的圖數(shù)據(jù)為2007年uk頂級(jí)域名下域名間的網(wǎng)頁(yè)鏈接關(guān)系數(shù)據(jù),共約1億頂點(diǎn)以及37億條邊,圖的平均度數(shù)約為37。下層分布式存儲(chǔ)系統(tǒng)采用hdfs1.1.2。使用同步圖計(jì)算系統(tǒng)giraph、seraph作為性能對(duì)照。
實(shí)驗(yàn)采用兩個(gè)圖計(jì)算領(lǐng)域的典型算法作為計(jì)算負(fù)載:pagerank和sssp,并根據(jù)本發(fā)明方法的需求針對(duì)每個(gè)算法實(shí)現(xiàn)了相應(yīng)的compute和generate等函數(shù)。所有系統(tǒng)和算法均使用java1.7實(shí)現(xiàn)。
圖2展示了本發(fā)明的實(shí)驗(yàn)系統(tǒng)、giraph系統(tǒng)和seraph系統(tǒng)在幾個(gè)典型圖計(jì)算任務(wù)下的運(yùn)行時(shí)間。由于本發(fā)明中基于雙隊(duì)列模型的異步圖計(jì)算方法的加入,實(shí)驗(yàn)系統(tǒng)的運(yùn)行時(shí)間大大短于現(xiàn)有系統(tǒng)。對(duì)于pagerank算法和sssp算法,實(shí)驗(yàn)系統(tǒng)的運(yùn)行時(shí)間只有seraph系統(tǒng)的11%和14%,只有g(shù)iraph系統(tǒng)的4%和18%。
圖3展示了本發(fā)明的實(shí)驗(yàn)系統(tǒng)、giraph系統(tǒng)和seraph系統(tǒng)在幾個(gè)典型圖計(jì)算任務(wù)下的運(yùn)行時(shí)內(nèi)存占用。由于本發(fā)明中基于雙隊(duì)列模型的異步圖計(jì)算方法的加入,實(shí)驗(yàn)系統(tǒng)的內(nèi)存占用小于現(xiàn)有系統(tǒng)。對(duì)于pagerank算法和sssp算法,實(shí)驗(yàn)系統(tǒng)的內(nèi)存占用只有seraph系統(tǒng)的59%和65%,只有g(shù)iraph系統(tǒng)的49%和66%。
以上實(shí)施例僅用以說(shuō)明本發(fā)明的技術(shù)方案而非對(duì)其進(jìn)行限制,本領(lǐng)域的普通技術(shù)人員可以對(duì)本發(fā)明的技術(shù)方案進(jìn)行修改或者等同替換,而不脫離本發(fā)明的精神和范圍,本發(fā)明的保護(hù)范圍應(yīng)以權(quán)利要求所述為準(zhǔn)。