標籤:大資料 系統架構 圖資料庫
/* 著作權聲明:可以任意轉載,轉載時請務必標明文章原始出處和作者資訊 .*/
author: 張俊林
節選自《大資料日知錄:架構與演算法》十四章,書籍目錄在此
對於離線挖掘類圖計算而言,目前已經湧現出眾多各方面表現優秀而各具特點的實際系統,典型的比如Pregel、Giraph、Hama、PowerGraph、GraphLab、GraphChi等。通過對這些系統的分析,我們可以歸納出離線挖掘類圖計算中一些常見的計算模型。
本節將常見的計算模型分為兩類,一類是圖編程模型,另一類是圖計算範型。編程模型更多地面向圖計算系統的應用開發人員,而計算範型則是圖計算系統開發人員需要關心的問題。在本節中,關於編程模型,主要介紹以節點為中心的編程模型及其改進版本的GAS編程模型;關於計算範型,則重點介紹同步執行模型和非同步執行模型。這幾類模型已經被廣泛採用在目前的大規模圖挖掘系統中。
14.4.1 以節點為中心的編程模型
以節點為中心的編程模型(Vertex-Centered ProgrammingModel)首先由Pregel系統提出,之後的絕大多數離線挖掘類大規模圖計算系統都採用這個模型作為編程模型。
對圖G=(V,E)來說,以節點為中心的編程模型將圖節點vertex?V看作計算的中心,應用開發人員可以自訂一個與具體應用密切相關的節點更新函數Function(vertex),這個函數可以擷取並改變圖節點vertex及與其有關聯的邊的權值,甚至可以通過增加和刪除邊來更改圖結構。對於所有圖中的節點都執行節點更新函數Function(vertex)來對圖的狀態(包括節點資訊和邊資訊)進行轉換,如此反覆迭代進行,直到達到一定的停止標準為止。
典型的圖節點更新函數Function(vertex)基本遵循如下邏輯。
即首先從vertex的入邊和出邊收集資訊,對這些資訊經過針對節點權值的函數f()變換後,將計算得到的值更新vertex的權值,之後以節點的新權值和邊原先的權值作為輸入,通過針對邊的函數g()進行變換,變換後的值用來依次更新邊的權值。通過vertex的節點更新函數,來達到更新部分圖狀態的目的。
以節點為中心的編程模型有很強的表達能力。研究表明,很多類型的問題都可以通過這個編程模型來進行表達,比如很多圖挖掘、資料採礦、機器學習甚至是線性代數的問題都可以以這種編程模型來獲得解決。這也是為何以圖節點為中心的編程模型大行其道的根本原因。
14.4.2 GAS編程模型
GAS模型可以看作是對以節點為中心的圖計算編程模型的一種細粒度改造,通過將計算過程進一步細分來增加計算並發性。GAS模型明確地將以節點為中心的圖計算模型的節點更新函數Function(Vertex)劃分為三個連續的處理階段:資訊收集階段(Gather)、應用階段(Apply)和分發階段(Scatter)。通過這種明確的計算階段劃分,可以使原先的一個完整計算流程細分,這樣在計算過程中可以將各個子處理階段並發執行來進一步增加系統的並發處理效能。
這裡假設當前要進行計算的節點是u,並以此為基礎來說明GAS模型。
在資訊收集階段,將
u節點的所有鄰接節點和相連的邊上的資訊通過一個通用累加函數收集起來:
通過以上三個階段的操作,可以定義以圖節點為中心的高度抽象的GAS計算模型。在GAS模型中,節點的入邊和出邊在資訊收集和分發階段如何使用取決於具體的應用,比如,在PageRank計算中,資訊收集階段只考慮入邊資訊,分發階段只考慮出邊資訊,但是在類似於Facebook的社交關係圖中,如果邊表達的語義是朋友關係,那麼在資訊收集和分發階段則是所有邊的資訊都會納入計算範圍。
14.4.3 同步執行模型
同步執行模型是相對於非同步執行模型而言的。我們知道,圖計算往往需要經過多輪迭代過程,在以節點為中心的圖編程模型下,在每輪迭代過程中對圖節點會調用使用者自訂函數Function(vertex),這個函數會更改vertex節點及其對應邊的狀態,如果節點的這種狀態變化在本輪迭代過程中就可以被其他節點看到並使用,也就是說變化立即可見,那麼這種模式被稱為非同步執行模型;如果所有的狀態變化只有等到下一輪迭代才可見並允許使用,那麼這種模式被稱為同步執行模型。採用同步執行模型的系統在迭代過程中或者連續兩輪迭代過程之間往往存在一個同步點,同步點的目的在於保證每個節點都已經接受到本輪迭代更新後的狀態資訊,以保證可以進入下一輪的迭代過程。
在實際的系統中,兩種典型的同步執行模型包括BSP模型和MapReduce模型。關於BSP模型的介紹及其與MapReduce模型的關係,可以參考本書“機器學習:範型與架構”一章,這裡不再贅述。下面介紹圖計算中的MapReduce計算模型,總體而言,由於很多圖挖掘演算法帶有迭代啟動並執行特點,MapReduce計算模型並不是十分適合解決此類問題的較佳答案,但是由於Hadoop的廣泛流行,實際工作中還有一些圖計算是採用MapReduce機制來進行的。
14.4.4 非同步執行模型
非同步執行模型相對於同步執行模型而言,因為不需要進行資料同步,而且更新的資料能夠在本輪迭代即可被使用,所以演算法收斂速度快,系統輸送量和執行效率都要明顯高於同步模型。但是非同步模型也有相應的缺點:其很難推斷程式的正確性。因為其資料更新立即生效,所以節點的不同執行順序很可能會導致不同的運行結果,尤其是對圖節點並發更新計算的時候,還可能產生爭用狀況(Race Condition)和資料不一致的問題,所以其在系統實現的時候必須考慮如何避免這些問題,系統實現機制較同步模型複雜。
下面以GraphLab為例講解非同步執行模型的資料一致性問題,GraphLab比較適合應用於機器學習領域的非自然圖計算情形,比如馬爾科夫隨機場(MRF)、隨機梯度下降演算法(SGD)等機器學習演算法。
在講解非同步模型的資料一致性問題前,先來瞭解一下GraphLab論文提出的圖節點的範圍(Scope)概念。對於圖G中的某個節點v來說,其範圍Sv包括:節點v本身、與節點v關聯的所有邊,以及節點v的所有鄰接圖節點。之所以定義圖節點的範圍,是因為在以節點為中心的編程模型中,範圍體現了節點更新函數f(v)能夠涉及的圖物件範圍及與其繫結資料。
在並發的非同步執行模型下,可以定義三類不同強度的資料一致性條件(見圖14-12),根據其一致性限制條件的強度,由強到弱分別為:絕對一致性(Full Consistency)、邊一致性(Edge Consistency)和節點一致性(Vertex Consistency)。
絕對一致性的含義是:在節點v的節點更新函數f(v)執行期間,保證不會有其他更新函數去讀寫或者更改節點v的範圍Sv內圖對象的資料。因此,滿足絕對一致性條件的情形下,並行計算只允許出現在無公用鄰接點的圖節點之間,因為如果兩個圖節點有公用鄰接圖節點,那麼兩者的範圍必有交集,若兩者並發執行,可能會發生爭用狀況,而這違反了絕對一致性的定義。
比絕對一致性稍弱些的是邊一致性條件,其含義為:在節點v的節點更新函數f(v)執行期間,保證不會有其他更新函數去讀寫或者更改節點v,以及與其鄰接的所有邊的資料。即與絕對一致性條件相比,放鬆了條件,允許讀寫與節點v鄰接的其他圖節點的資料。在滿足邊一致性條件下,並行計算允許出現在無公用邊的圖節點之間,因為只要兩個節點u和v不存在共用邊,則一定會滿足邊一致性條件。
更弱一些的是節點一致性,其含義為:在節點v的節點更新函數f(v)執行期間,保證不會有其他更新函數去讀寫或者更改節點v的資料。很明顯,最弱的節點一致效能夠允許最大程度的並發,之所以說其限制條件較弱,是因為除非應用邏輯可以保證節點更新函數f(v)唯讀寫節點本身的資料,否則很易發生爭用狀況,使得程式運行結果不一致。
選擇不同的一致性模型對於並行程式執行的結果正確性有很大影響,所謂並存執行的結果正確性,可以用其和順序執行相比是否一致來進行判斷。因此,可以定義“序列一致性”如下:
如果對所有可能的並發執行順序總是存在與序列執行完全一致的執行結果,在此種情形下,我們可以將這個並發程式稱為是滿足序列一致性的。
是否滿足序列一致性可以協助我們驗證將一個順序執行的程式改造為並存執行程式後的正確性。在並行的非同步圖計算環境下,以下三種情形是可以滿足序列一致性的。
情形一:滿足絕對一致性條件。
情形二:滿足邊一致性條件,並且節點更新函數f(v)不會修改鄰接節點的資料。
情形三:滿足節點一致性條件,並且節點更新函數f(v)只會讀寫節點本身的資料。
上面三種情形可供應用者在設計演算法時參考,以在並發性和結果正確性之間做好權衡:一致性條件越弱,則並發能力越強,但是爭用狀況發生機率越高,即結果可能越難保障正確性。如果應用能夠明確節點更新函數的資料涉及範圍,就可以根據上述幾種情形來進行選擇,更好地做到在保證結果正確性的前提下提高並發效能。
大資料圖資料庫之離線挖掘計算模型