溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

大數(shù)據(jù)開發(fā)中Spark-Graph如何進行快速入門

發(fā)布時間:2021-12-17 10:26:32 來源:億速云 閱讀:140 作者:柒染 欄目:大數(shù)據(jù)

本篇文章給大家分享的是有關大數(shù)據(jù)開發(fā)中Spark-Graph如何進行快速入門,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

1.Spark Graph簡介

GraphX 是 Spark 一個組件,專門用來表示圖以及進行圖的并行計算。GraphX 通過重新定義了圖的抽象概念來拓展了 RDD: 定向多圖,其屬性附加到每個頂點和邊。為了支持圖計算, GraphX 公開了一系列基本運算符(比如:mapVertices、mapEdges、subgraph)以及優(yōu)化后的 Pregel API 變種。此外,還包含越來越多的圖算法和構建器,以簡化圖形分析任務。GraphX在圖頂點信息和邊信息存儲上做了優(yōu)化,使得圖計算框架性能相對于原生RDD實現(xiàn)得以較大提升,接近或到達 GraphLab 等專業(yè)圖計算平臺的性能。GraphX最大的貢獻是,在Spark之上提供一棧式數(shù)據(jù)解決方案,可以方便且高效地完成圖計算的一整套流水作業(yè)。

圖計算的模式

基本圖計算是基于BSP的模式,BSP即整體同步并行,它將計算分成一系列超步的迭代。從縱向上看,它是一個串行模式,而從橫向上看,它是一個并行的模式,每兩個超步之間設置一個柵欄(barrier),即整體同步點,確定所有并行的計算都完成后再啟動下一輪超步。

每一個超步包含三部分內容: 計算compute:每一個processor利用上一個超步傳過來的消息和本地的數(shù)據(jù)進行本地計算 消息傳遞:每一個processor計算完畢后,將消息傳遞個與之關聯(lián)的其它processors 整體同步點:用于整體同步,確定所有的計算和消息傳遞都進行完畢后,進入下一個超步

大數(shù)據(jù)開發(fā)中Spark-Graph如何進行快速入門

2.來看一個例子

圖描述

## 頂點數(shù)據(jù)
1, "SFO"
2, "ORD"
3, "DFW"
## 邊數(shù)據(jù)
1, 2,1800
2, 3, 800
3, 1, 1400

計算所有的頂點,所有的邊,所有的triplets,頂點數(shù),邊數(shù),頂點距離大于1000的有那幾個,按頂點的距離排序,降序輸出

代碼實現(xiàn)

package com.hoult.Streaming.work

import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.graphx.{Edge, Graph, VertexId}
import org.apache.spark.rdd.RDD

object GraphDemo {
  def main(args: Array[String]): Unit = {
    // 初始化
    val conf = new SparkConf().setAppName(this.getClass.getCanonicalName.init).setMaster("local[*]")
    val sc = new SparkContext(conf)
    sc.setLogLevel("warn")

    //初始化數(shù)據(jù)
    val vertexArray: Array[(Long, String)] = Array((1L, "SFO"), (2L, "ORD"), (3L, "DFW"))
    val edgeArray: Array[Edge[Int]] = Array(
      Edge(1L, 2L, 1800),
      Edge(2L, 3L, 800),
      Edge(3L, 1L, 1400)
    )

    //構造vertexRDD和edgeRDD
    val vertexRDD: RDD[(VertexId, String)] = sc.makeRDD(vertexArray)
    val edgeRDD: RDD[Edge[Int]] = sc.makeRDD(edgeArray)

    //構造圖
    val graph: Graph[String, Int] = Graph(vertexRDD, edgeRDD)

    //所有的頂點
    graph.vertices.foreach(println)

    //所有的邊
    graph.edges.foreach(println)

    //所有的triplets
    graph.triplets.foreach(println)

    //求頂點數(shù)
    val vertexCnt = graph.vertices.count()
    println(s"頂點數(shù):$vertexCnt")

    //求邊數(shù)
    val edgeCnt = graph.edges.count()
    println(s"邊數(shù):$edgeCnt")

    //機場距離大于1000的
    graph.edges.filter(_.attr > 1000).foreach(println)

    //按所有機場之間的距離排序(降序)
    graph.edges.sortBy(-_.attr).collect().foreach(println)
  }
}

輸出結果

大數(shù)據(jù)開發(fā)中Spark-Graph如何進行快速入門

3.圖的一些相關知識

例子是demo級別的,實際生產環(huán)境下,如果使用到必然比這個復雜很多,但是總的來說,一定場景才會使用到吧,要注意圖計算情況下,要注意緩存數(shù)據(jù),RDD默認不存儲于內存中,所以可以盡量使用顯示緩存,迭代計算中,為了獲得最佳性能,也可能需要取消緩存。默認情況下,緩存的RDD和圖保存在內存中,直到內存壓力迫使它們按照LRU【最近最少使用頁面交換算法】逐漸從內存中移除。對于迭代計算,先前的中間結果將填滿內存。經過它們最終被移除內存,但存儲在內存中的不必要數(shù)據(jù)將減慢垃圾回收速度。因此,一旦不再需要中間結果,取消緩存中間結果將更加有效。這涉及在每次迭代中實現(xiàn)緩存圖或RDD,取消緩存其他所有數(shù)據(jù)集,并僅在以后的迭代中使用實現(xiàn)的數(shù)據(jù)集。但是,由于圖是有多個RDD組成的,因此很難正確地取消持久化。對于迭代計算,建議使用Pregel API,它可以正確地保留中間結果。 

以上就是大數(shù)據(jù)開發(fā)中Spark-Graph如何進行快速入門,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經查實,將立刻刪除涉嫌侵權內容。

AI