Pregel:基于圖分割的圖結構數據并行處理
Pregel設計在google的計算機集群結構之上。一個計算機集群(cluster)就是通用PC按rack(一組PC機)構成,Rack之間具有較高的數據傳輸速度。集群中通常包含一個域名服務器(namenode),采用分布式文件系統,例如:GFS(google 分布式文件系統),HDFS(Hadroop 分布式文件系統),TFS(淘寶分布式文件系統)等。域名服務器包含了分布式文件系統中文件名與文件地址之間的鍵值對索引(index)。
Pregel庫首先分割圖結構的數據,每一個分割包含一組頂點以及由這組頂點向外的邊,每個頂點由一個編號(vertex_ID)唯一確定。庫默認的N份分割函數是哈希函數(hash(vertex_ID) mod N),當然用戶可以自己編寫分割函數以代替它。
將各頂點分配給計算機的方法在Pregel中對用戶并不是很透明。某些應用采用默認的分配方式性能還好,但是有時需要用戶定義分配函數以更好的利用本地數據。例如,對于web graph(網頁圖),通常將頂點分配給其對應網頁所在站點。
Pregel程序運行流程:
-
用戶程序的多份拷貝開始在集群上運行。其中一份拷貝作為master(負責者),只負責協調其余worker(工作者)的活動。
-
master決定圖結構數據的分割,并將一份或多份分割分配給worker。分割數量可以由用戶控制,更大的分割數量通常具有更好的并行性,與均衡性,因此能提高性能。每個worker負責維護它所分配的那部分圖的分割的狀態,執行用戶定義的compute()方法,以及管理消息的接收與發送。每個worker都具有圖分割的所有信息。
-
master發送給各worker相應的用戶輸入信息。
-
待所有worker都就緒后,master發送指令啟動一次迭代(superstep)。一個分割對應一個進程,并為分割中的每個頂點執行compute()方法,接受消息,發送消息。當worker結束迭代之前,會給master發送尚活躍的頂點數。循環該步,直到所有頂點都終止(non-active)。
-
計算結束,master發送指令,worker保存graph計算結果。