藉助ArangoDB,帶你玩轉Google圖算法引擎Pregel

藉助ArangoDB,帶你玩轉Google圖算法引擎Pregel

 
 

ArangoDB團隊研究出一種算法,能夠在一個圖中識別出已連接的子圖,文中以國家爲例;在ArangoDB中引入Pregel框架,通過Worker算法、合成算法、pregelRunner模塊來執行不同的實現方式。來試試吧!

ArangoDB團隊研究出一種算法,能夠在一個圖中識別出已連接的子圖,文中以國家爲例;在ArangoDB中引入Pregel框架,通過Worker算法、合成算法、pregelRunner模塊來執行不同的實現方式。開發者也可以自行編寫算法,編程世界魅力無窮!

譯文如下:

Pregel作爲Google推出的一種面向圖算法的分佈式編程框架,主要用於處理大規模的圖算法計算。比如,圖遍歷(BFS)、最短路徑(SSSP)、PageRank計算等。

檢測“已連接節點”的算法

爲了解決已連接節點的問題,ArangoDB團隊研究出一種算法,能夠在一個圖中識別出已連接的子圖。這裏以國家爲例子,下圖包含10個國家,互相之間的關係定義爲邊界接壤(hasBorderWith),其形成的4種已連接節點組分別爲:

  1. 德國,奧地利,瑞士
  2. 摩洛哥,阿爾及利亞,突尼斯
  3. 巴西,阿根廷,烏拉圭
  4. 澳大利亞

要導入該圖,請點擊這裏進行下載,然後打開ArangoShell並執行如下語句:

Worker算法

Worker算法執行於圖中每個頂點之上,每個頂點有一個相關的消息遊標和一個global對象,裏面含有步長信息和用戶定義的Global數據。該算法定義如下:

爲了檢測所有的節點組,這裏使用了一種非常直接的方法:

每個節點組有一個字母標識符,存有其頂點最後的_key屬性信息。所以,第0步的時候,每個頂點存儲的是其自身的key信息以及初始鄰近接壤節點信息。要訪問源頂點需要使用_get(“someAttribute”)方法:

一個頂點只能訪問其外部邊界,因此在第1步的時候要記得把它所有接收到的消息放入數組中,以便進行向後通信,同時要根據傳入的消息來更新節點組。

所以前兩步的操作開啓了向前和向後通信,接着執行算法直到每個頂貼都接收到其頂點組標識信息。因此,當接收到鄰近標識符信息後,每個頂點需要更新頂點組標識信息:

當一個頂點不再接收到新的消息或新的組標識時,要使它暫時失效。僅當再從鄰近頂點接收新消息的時候進行激活:

如果接收到新的組標識時要把結果進行存儲:

接着要通知鄰近頂點,包括向前與向後:

然後失效該頂點直到接收到新的消息:

合成算法

爲了減少冗餘的消息使得工作者算法更加高效,ArangoDB團隊引入了消息合成算法。比方說在該示例中,德國節點可能會收到來自奧地利和瑞士的消息;由於按字母排序,奧地利的消息可以忽略,從而減少不必要的消息接收。在Pregel中的消息合成器可定義爲:

合成器會篩選冗餘消息,然後發送有效的標識信息:

引入該算法後,德國節點雖然有兩個接壤點,但是隻會收到一個消息。

pregelRunner模塊

首先創建Runner實例:

Pregel算法的具體實現請點擊這裏進行下載。在Shell中載入該文件,使Runner可以實現相關函數:

然後在圖中啓動Pregel:

啓動後會接收到唯一的執行碼,可以使用runner來查閱當前運行狀態:

執行完畢後可以得到圖的結果名:

要檢查該結果是否符合要求,可以載入全部頂點進行校對:

結果是正確的,算法能正確識別出4個子圖(瑞士,突尼斯,烏拉圭,澳大利亞)。最後要做好收尾工作:

寫在最後:

ArangoDB仍在進一步完善pregelRunner以滿足更大規模圖處理的需求。很多受時間和內存限制的大型圖問題在Pregel系統中都可逐步解決,例如:最短路徑,圖着色,最小生成樹等。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章