Spark GraphX圖計算快速入門
一.概述
GraphX是Spark中用於圖形和圖形平行計算的新元件。在較高的層次上,GraphX通過引入新的Graph抽象來擴充套件SparkRDD:一個有向多重圖,其屬性附加到每個頂點和邊上。為了支援圖計算,GraphX公開了一組基本的操作符(例如,subgraph,joinVertices和aggregateMessages),以及所述的優化的變體PregelAPI。此外,GraphX包括越來越多的圖形演算法和構建器集合,以簡化圖形分析任務。
二.入門
首先,需要將Spark和GraphX匯入專案,如下所示:
import org.apache.spark._ import org.apache.spark.graphx._// To make some of the examples work we will also need RDD import org.apache.spark.rdd.RDD
如果不使用Spark Shell,則還需要一個SparkContext
。
三.屬性圖
GraphX的屬性曲線圖是一個有向多重圖與連線到每個頂點和邊的使用者定義的物件。有向多重圖是有向圖,其中存在的多個平行邊共享相同的源和目標頂點。支援平行邊的功能簡化了在相同頂點之間可能存在多個關係(例如,同事和朋友)的建模場景。每個頂點均由唯一的64位長識別符號(VertexId
)設定金鑰。GraphX對頂點識別符號沒有施加任何排序約束。
在頂點(VD
)和邊(ED
)型別上對屬性圖進行了引數化。這些是分別與每個頂點和邊關聯的物件的型別。
當頂點和邊型別是原始資料型別(例如int,double等)時,GraphX可以優化它們的表示形式,方法是將它們儲存在專用陣列中,從而減少了記憶體佔用量。
在某些情況下,可能希望在同一圖形中具有不同屬性型別的頂點。這可以通過繼承來實現。例如,要將使用者和產品建模為二部圖,我們可以執行以下操作:
class VertexProperty() case class UserProperty(val name : String) extends VertexPropertycase class ProductProperty(val name : String, val price : Double) extends VertexProperty // The graph might then have the type: var graph : Graph[VertexProperty, String] = null
像RDD一樣,屬性圖是不可變的,分散式的和容錯的。圖的值或結構的更改是通過生成具有所需更改的新圖來完成的。注意,原始圖的實質部分(即不受影響的結構,屬性和索引)在新圖中被重用,從而降低了這種固有功能資料結構的成本。使用一系列頂點分割槽試探法在執行程式之間劃分圖。與RDD一樣,發生故障時,可以在不同的計算機上重新建立圖形的每個分割槽。
邏輯上,屬性圖對應於一對型別化集合(RDD),它們對每個頂點和邊的屬性進行編碼。結果,圖類包含訪問圖的頂點和邊的成員:
class Graph[VD, ED] { val vertices: VertexRDD[VD] val edges: EdgeRDD[ED] }
Graph的類是VertexRDD[VD]
和EdgeRDD[ED]的
延伸,並且分別包含被優化的版本RDD[(VertexId, VD)]
和RDD[Edge[ED]]
。VertexRDD[VD]和
EdgeRDD[ED]
提供圍繞圖形計算,並利用內部優化內建附加功能。