GraphX原型論文
GraphX是Spark中用於圖(e.g., Web-Graphs and Social Networks)和圖並行計算(e.g., PageRank and Collaborative Filtering)的API,可以認為是GraphLab(C++)和Pregel(C++)在Spark(Scala)上的重寫及優化,跟其他分布式圖計算框架相比,GraphX最大的貢獻是,在Spark之上提供一棧式數據解決方案,可以方便且高效地完成圖計算的一整套流水作業。
GraphX最先是伯克利AMPLAB的一個分布式圖計算框架項目,后來整合到Spark中成為一個核心組件,這里的內容是基於論文
Xin, Reynold S., et al. "GraphX: Unifying Data-Parallel and Graph-Parallel Analytics." arXiv preprint arXiv:1402.2394 (2014).[PPT] [Talk][Video][GitHub][Hands-on Exercises]
圖計算
Graph來描述參數之間的關系,可以自然地做model partition/parallel,傳統地用key-value存儲參數的方式,可能會損失模型結構信息。
Graphx圖處理流水線
Graphx是Spark生態中的非常重要的組件,融合了圖並行以及數據並行的優勢,雖然在單純的計算機段的性能相比不如GraphLab等計算框架,但是如果從整個圖處理流水線的視角(圖構建,圖合並,最終結果的查詢)看,那么性能就非常具有競爭性了。
兩種視圖
- GraphX通過引入Resilient Distributed Property Graph(一種點和邊都帶屬性的有向多圖)擴展了Spark RDD這種抽象數據結構,這種Property Graph擁有兩種Table和Graph兩種視圖(及視圖對應的一套API),而只有一份物理存儲。
- Table視圖將圖看成Vertex Property Table和Edge Property Table等的組合,這些Table繼承了Spark RDD的API(fiter,map等)。
- Graph視圖上包括reverse/subgraph/mapV(E)/joinV(E)/mrTriplets等操作。結合pagerank和社交網絡的實例看看mrTriplets(最復雜的一個API )的用法。
優化
- 點分割:graphx借鑒powerGraph,使用的是vertexcut(點分割)方式存儲圖。這種存儲方式特點是任何一條邊只會出現在一台機器上,每個點有可能分布到不同的機器上。當點被分割到不同機器上時,是相同的鏡像,但是有一個點作為主點(master),其他的點作為虛點(ghost),當點B的數據發生變化時,先更新點B的master的數據,然后將所有更新好的數據發送到B的ghost所在的所有機器,更新B的ghost。這樣做的好處是在邊的存儲上是沒有冗余的,而且對於某個點與它的鄰居的交互操作,只要滿足交換律和結合律,比如求鄰居權重的和,求點的所有邊的條數這樣的操作,可以在不同的機器上並行進行,只要把每個機器上的結果進行匯總就可以了,網絡開銷也比較小。代價是每個點可能要存儲多份,更新點要有數據同步開銷。
- Routing Table:vertex Table中的一個partition對應着Routing Table中的一個partition,Routing Table指示了一個vertex會涉及到哪些Edge Table partition。
- Caching for Iterative mrTriplets&Indexing Active Edges:在迭代的后期,只有很少的點有更新,因此對沒有更新的點使用local cached能夠大幅降低通信所耗。
- Join Elimination:例如在PR計算中,一個點值的更新只跟鄰居的值有關,而跟它本身的值無關,那么在mrTriplets計算中,就不需要Vertex Table和Edge Table的3-way join,而只需要2-way join。
此外,還有一些Index和Data Reuse的查詢優化。
性能
- GraphX整體上比GraphLab慢2-3倍,有兩方面的原因:1)GraphX跑在JVM上,沒有C++快是顯然的 2)GraphLab不受Spark框架的限制,可以通過Threads來共享內存,而GraphX就算在同一台機器上都有communication cost,“GraphX have to go through the full network stack even communicating between patrition on the same machine.”
- GraphX在超大規模數據下,Runtime的增長比GraphLab要慢,scalability要好一些。
- 從整個圖計算Pipeline來說,GraphX的總體Runtime少於GraphLab+Spark。
社交網絡實驗
代碼量
雜談
- GraphX論文的作者Joseph Gonzalez在今年ICML上做了關於大規模機器學習系統對比的報告
- Spark的GraphX是從表到圖、允許圖與表的交互,GraphLab也認識到表對圖的重要性,在其Python包GraphLab Create里提供SFrame,即基於表的圖表示,該圖表示數據存在於HDFS,S3或直接從URL讀取,支持Tb級的數據(雖然不大,比PyData和R強),提供基於表的groupby aggregation/joins/user defined transformations/append等API, 功能和語法類似於pandas- and R- dataframes。
參考
轉載請注明出處:
十分鍾了解分布式計算:GraphX