Spark圖處理GraphX學(xué)習(xí)筆記!

Spark圖處理GraphX學(xué)習(xí)筆記!

10年積累的成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問(wèn)題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站設(shè)計(jì)后付款的網(wǎng)站建設(shè)流程,更有賀蘭免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

一、什么是GraphX?

Graphx利用了Spark這樣了一個(gè)并行處理框架來(lái)實(shí)現(xiàn)了圖上的一些可并行化執(zhí)行的算法。

  • 算法是否能夠并行化與Spark本身無(wú)關(guān)

  • 算法并行化與否的本身,需要通過(guò)數(shù)學(xué)來(lái)證明

  • 已經(jīng)證明的可并行化算法,利用Spark來(lái)實(shí)現(xiàn)會(huì)是一個(gè)錯(cuò)的選擇,因?yàn)镚raphx支持pregel的圖計(jì)算模型

二、Graphx包含哪些組件和基本框架?

1、成員變量

graph中重要的成員變量分別為

  1. vertices

  2. edges

  3. triplets

為什么要引入triplets呢,主要是和Pregel這個(gè)計(jì)算模型相關(guān),在triplets中,同時(shí)記錄著edge和vertex. 具體代碼就不羅列了。

2、成員函數(shù)

函數(shù)分成幾大類

  1. 對(duì)所有頂點(diǎn)或邊的操作,但不改變圖結(jié)構(gòu)本身,如mapEdges, mapVertices

  2. 子圖,類似于集合操作中的filter subGraph

  3. 圖的分割,即paritition操作,這個(gè)對(duì)于Spark計(jì)算來(lái)說(shuō),很關(guān)鍵,正是因?yàn)橛辛瞬煌腜artition,才有了并行處理的可能, 不同的PartitionStrategy,其收益不同。最容易想到的就是利用Hash來(lái)將整個(gè)圖分成多個(gè)區(qū)域。

  4. outerJoinVertices 頂點(diǎn)的外連接操作


三、圖的運(yùn)算和操作 GraphOps

圖的常用算法是集中抽象到GraphOps這個(gè)類中,在Graph里作了隱式轉(zhuǎn)換,將Graph轉(zhuǎn)換為GraphOps,具體有下列12個(gè)算子:

  1. collectNeighborIds

  2. collectNeighbors

  3. collectEdges

  4. joinVertices

  5. filter

  6. pickRandomVertex

  7. pregel

  8. pageRank

  9. staticPageRank

  10. connectedComponents

  11. triangleCount

  12. stronglyConnectedComponents

RDD

RDD是Spark體系的核心,那么Graphx中引入了哪些新的RDD呢,有倆,分別為

  1. VertexRDD

  2. EdgeRDD

較之EdgeRdd,VertexRDD更為重要,其上的操作也很多,主要集中于Vertex之上屬性的合并,說(shuō)到合并就不得不扯到關(guān)系代數(shù)和集合論,所以在VertexRdd中能看到許多類似于sql中的術(shù)語(yǔ),如

  • leftJoin

  • innerJoin

四、GraphX場(chǎng)景分析

1、圖的存儲(chǔ)和加載

在進(jìn)行數(shù)學(xué)計(jì)算的時(shí)候,圖用線性代數(shù)中的矩陣來(lái)表示,那么如何進(jìn)行存儲(chǔ)呢?

學(xué)數(shù)據(jù)結(jié)構(gòu)的時(shí)候,老師肯定說(shuō)過(guò)好多的辦法,不再啰嗦了。

不過(guò)在大數(shù)據(jù)的環(huán)境下,如果圖很巨大,表示頂點(diǎn)和邊的數(shù)據(jù)不足以放在一個(gè)文件中怎么辦? 用HDFS

加載的時(shí)候,一臺(tái)機(jī)器的內(nèi)存不足以容下怎么辦? 延遲加載,在真正需要數(shù)據(jù)時(shí),將數(shù)據(jù)分發(fā)到不同機(jī)器中,采用級(jí)聯(lián)方式。

一般來(lái)說(shuō),我們會(huì)將所有與頂點(diǎn)相關(guān)的內(nèi)容保存在一個(gè)文件中vertexFile,所有與邊相關(guān)的信息保存在另一個(gè)文件中edgeFile。

生成某一個(gè)具體的圖時(shí),用edge就可以表示圖中頂點(diǎn)的關(guān)聯(lián)關(guān)系,同時(shí)圖的結(jié)構(gòu)也表示出來(lái)了。

下面是Spark官方示例,用2個(gè)Array構(gòu)造了一個(gè)Graph。

val users: RDD[(VertexId, (String, String))] =

  sc.parallelize(Array((3L, ("rxin", "student")), (7L, ("jgonzal", "postdoc")),

                       (5L, ("franklin", "prof")), (2L, ("istoica", "prof"))))

// Create an RDD for edges

val relationships: RDD[Edge[String]] =

  sc.parallelize(Array(Edge(3L, 7L, "collab"),    Edge(5L, 3L, "advisor"),

                       Edge(2L, 5L, "colleague"), Edge(5L, 7L, "pi")))

// Define a default user in case there are relationship with missing user

val defaultUser = ("John Doe", "Missing")

// Build the initial Graph

val graph = Graph(users, relationships, defaultUser)

2、GraphLoader

graphLoader是graphx中專門(mén)用于圖的加載和生成,最重要的函數(shù)就是edgeListFile。

//以頂點(diǎn)劃分,分成4個(gè)分區(qū)

val graph = GraphLoader.edgeListFile(sc,"hdfs://192.168.0.10:9000/input/graph/web-Google.txt",minEdgePartitions = 4)

五、GraphX應(yīng)用舉例

一行代碼:

val rank = graph.pageRank(0.01).vertices



用RDD實(shí)現(xiàn):

完整代碼

// Connect to the Spark clusterval 
sc = new SparkContext("spark://master.amplab.org", "research")
// Load my user data and parse into tuples of user id and attribute list
val users = (sc.textFile("graphx/data/users.txt")
  .map(line => line.split(","))
  .map( parts => (parts.head.toLong, parts.tail) ))
  // Parse the edge data which is already in userId -> userId format
  val followerGraph = GraphLoader.edgeListFile(sc, "graphx/data/followers.txt")
  // Attach the user attributes
  val graph = followerGraph.outerJoinVertices(users) { 
   case (uid, deg, Some(attrList)) => attrList  
   // Some users may not have attributes so we set them as empty
    case (uid, deg, None) => Array.empty[String]
    }
// Restrict the graph to users with usernames and names
val subgraph = graph.subgraph(vpred = (vid, attr) => attr.size == 2)
// Compute the PageRank

// Get the attributes of the top pagerank users
val userInfoWithPageRank = subgraph.outerJoinVertices(pagerankGraph.vertices) { 
 case (uid, attrList, Some(pr)) => (pr, attrList.toList) 
  case (uid, attrList, None) => (0.0, attrList.toList)
}

println(userInfoWithPageRank.vertices.top(5)(Ordering.by(_._2._1)).mkString("\n"))



本文名稱:Spark圖處理GraphX學(xué)習(xí)筆記!
標(biāo)題來(lái)源:http://bm7419.com/article26/jcsgjg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)公司、手機(jī)網(wǎng)站建設(shè)、網(wǎng)站建設(shè)、動(dòng)態(tài)網(wǎng)站、網(wǎng)站設(shè)計(jì)企業(yè)建站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

綿陽(yáng)服務(wù)器托管