Spark GraphX簡介與教程

banq發表於2021-12-29

GraphX是 Apache Spark 用於圖形和圖形平行計算的 API。GraphX 在單個系統內統一了 ETL(提取、轉換和載入)過程、探索性分析和迭代圖計算。圖的用法可以在 Facebook 的朋友、LinkedIn 的連線、網際網路的路由器、天體物理學中星系和恆星之間的關係以及谷歌的地圖中看到。儘管圖計算的概念看起來很簡單,但圖的應用在災難檢測、銀行、股票市場、銀行和地理系統中的用例實際上是無限的.

  

什麼是圖Graph?

圖是一種數學結構,相當於一組物件,其中一些物件對在某種意義上是相關的。這些關係可以使用形成圖的邊和頂點來表示。頂點代表物件,邊顯示這些物件之間的各種關係。

在電腦科學中,圖是一種抽象的資料型別,旨在實現數學中的無向圖和有向圖概念,特別是圖論領域。圖資料結構還可以將某些邊值與每條邊相關聯,例如符號標籤或數字屬性(成本、容量、長度、等等。)。

 

圖計算的用例

以下用例給出了圖計算的視角以及使用圖實現其他解決方案的進一步範圍。

  1. 災害檢測系統  圖可用於檢測颶風、地震、海嘯、森林火災和火山等災害,從而提供警告以提醒人們。
  2. Page Rank :Page Rank 可用於在任何網路(如論文引用網路或社交媒體網路)中尋找影響者。
  3. 金融欺詐檢測 圖分析可用於監控金融交易並檢測參與金融欺詐和洗錢的人員。
  4. 商業分析 圖表與機器學習一起使用時,有助於瞭解客戶的購買趨勢。例如優步、麥當勞等。
  5. 地理資訊系統 圖被廣泛用於開發地理資訊系統的功能,如流域劃分和天氣預報。
  6. 谷歌Pregel  Pregel 是 Google 的可擴充套件和容錯平臺,具有足夠靈活的 API 來表達任意圖 演算法。

 

什麼是 Spark GraphX?

GraphX是用於圖形和圖形平行計算的 Spark API。它包括越來越多的圖形演算法和構建器,以簡化圖形分析任務。

GraphX 使用彈性分散式屬性圖擴充套件了 Spark RDD。 屬性圖是一個有向多重圖,可以有多個平行邊。每條邊和頂點都有與之關聯的使用者定義屬性。平行邊允許多個相同頂點之間的關係。

 

Spark GraphX 特性

以下是 Spark GraphX 的特點:

  1. 靈活性:Spark GraphX 適用於圖形和計算。GraphX 在單個系統中統一了 ETL(提取、轉換和載入)、探索性分析和迭代圖計算。我們可以檢視與圖和集合相同的資料,使用 RDD 有效地轉換和連線圖,並使用 Pregel API 編寫自定義迭代圖演算法。
  2. 速度:Spark GraphX 提供與最快的專業圖形處理系統相當的效能。它可與最快的圖形系統相媲美,同時保留了 Spark 的靈活性、容錯性和易用性。
  3. 不斷增長的演算法庫:我們可以從 Spark GraphX 提供的不斷增長的圖演算法庫中進行選擇。一些流行的演算法是頁面排名、連通分量、標籤傳播、S​​VD++、強連通分量和三角形計數。

  

用例子理解GraphX

我們現在將通過一個例子來理解 Spark GraphX 的概念。

Spark GraphX簡介與教程

檢視圖表,我們可以提取有關人(頂點Vertices)和他們之間的關係(邊)的資訊。此處的圖表代表 Twitter 使用者以及他們在 Twitter 上關注的人。例如,Bob 在 Twitter 上關注了 Davide 和 Alice。

 

讓我們使用 Apache Spark 實現相同的功能。首先,我們將為 GraphX 匯入必要的類。

//Importing the necessary classes 
import org.apache.spark._
import org.apache.spark.rdd.RDD 
import org.apache.spark.util.IntParam 
import org.apache.spark.graphx._
import org.apache.spark.graphx.util.GraphGenerators 

顯示頂點Vertices: 此外,我們現在將顯示使用者(頂點Vertices)的所有姓名和年齡。

val vertexRDD: RDD[(Long, (String, Int))] = sc.parallelize(vertexArray)
val edgeRDD: RDD[Edge[Int]] = sc.parallelize(edgeArray)
val graph: Graph[(String, Int), Int] = Graph(vertexRDD, edgeRDD)
graph.vertices.filter { case (id, (name, age)) => age > 30 }
.collect.foreach { case (id, (name, age)) => println(s"$name is $age")}

上述程式碼的輸出如下:

David is 42 
Fran is 50 
Ed is 55 
Charlie is 65

顯示邊:讓我們看看推特上誰喜歡誰。

for (triplet <- graph.triplets.collect)
{
println(s"${triplet.srcAttr._1} likes ${triplet.dstAttr._1}")
}

輸出結果:

Bob likes Alice
Bob likes David
Charlie likes Bob
Charlie likes Fran
David likes Alice
Ed likes Bob
Ed likes Charlie
Ed likes Fran

現在我們已經瞭解了 GraphX 的基礎知識,讓我們深入一點,並對其進行一些高階計算。

關注者數量:我們圖表中的每個使用者都有不同數量的關注者。讓我們看看每個使用者的所有關注者。

// Defining a class to more clearly model the user property
case class User(name: String, age: Int, inDeg: Int, outDeg: Int)
// Creating a user Graph
val initialUserGraph: Graph[User, Int] = graph.mapVertices{ case (id, (name, age)) => User(name, age, 0, 0) }
 
// Filling in the degree information
val userGraph = initialUserGraph.outerJoinVertices(initialUserGraph.inDegrees) {
case (id, u, inDegOpt) => User(u.name, u.age, inDegOpt.getOrElse(0), u.outDeg)
}.outerJoinVertices(initialUserGraph.outDegrees) {
case (id, u, outDegOpt) => User(u.name, u.age, u.inDeg, outDegOpt.getOrElse(0))
}
for ((id, property) <- userGraph.vertices.collect) {
println(s"User $id is called ${property.name} and is liked by ${property.inDeg} people.")
}

上述程式碼的輸出如下:

使用者 1名為Alice ,被2個人喜歡。
使用者 2名為Bob ,被2個人喜歡。
使用者 3名為Charlie ,被1人喜歡。
使用者 4名為David ,被1人喜歡。
使用者 5名為Ed ,被0人喜歡。
使用者 6名為Fran ,被點贊2人。

最老的追隨者:我們還可以根據追隨者的特徵對追隨者進行排序。讓我們按年齡找出每個使用者的最老粉絲。

// Finding the oldest follower for each user
val oldestFollower: VertexRDD[(String, Int)] = userGraph.mapReduceTriplets[(String, Int)](
// For each edge send a message to the destination vertex with the attribute of the source vertex
 edge => Iterator((edge.dstId, (edge.srcAttr.name, edge.srcAttr.age))),
 // To combine messages take the message for the older follower
 (a, b) => if (a._2 > b._2) a else b
 )

上述程式碼的輸出如下:

大衛是愛麗絲最年長的追隨者。
查理是鮑勃最年長的追隨者。
Ed是查理最年長的追隨者。
鮑勃是大衛最年長的追隨者。
Ed沒有任何追隨者。
查理是最古老的追隨者弗蘭。

 

用例:使用 Spark GraphX 進行飛行資料分析

現在我們已經瞭解了 Spark GraphX 的核心概念,讓我們使用 GraphX 解決一個現實生活中的問題。這將有助於讓我們有信心在未來開展任何 Spark 專案。

問題陳述:要使用 Spark GraphX 分析實時航班資料,提供近乎實時的計算結果並使用 Google Data Studio 將結果視覺化。

  • 計算航線總數
  • 計算並排序最長的航線
  • 顯示頂點度數最高的機場
  • 根據 PageRank 列出最重要的機場
  • 列出飛行成本最低的航線

我們將使用 Spark GraphX 進行上述計算,並使用 Google Data Studio 將結果視覺化。

。。。。

詳細點選標題

 

相關文章