中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

Spark圖處理GraphX學習筆記!

發布時間:2020-07-04 19:34:06 來源:網絡 閱讀:2679 作者:moviebat 欄目:大數據

Spark圖處理GraphX學習筆記!


一、什么是GraphX?

Graphx利用了Spark這樣了一個并行處理框架來實現了圖上的一些可并行化執行的算法


  • 算法是否能夠并行化與Spark本身無關

  • 算法并行化與否的本身,需要通過數學來證明

  • 已經證明的可并行化算法,利用Spark來實現會是一個錯的選擇,因為Graphx支持pregel的圖計算模型


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


1、成員變量

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

  1. vertices

  2. edges

  3. triplets

為什么要引入triplets呢,主要是和Pregel這個計算模型相關,在triplets中,同時記錄著edge和vertex. 具體代碼就不羅列了。

2、成員函數

函數分成幾大類

  1. 對所有頂點或邊的操作,但不改變圖結構本身,如mapEdges, mapVertices

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

  3. 圖的分割,即paritition操作,這個對于Spark計算來說,很關鍵,正是因為有了不同的Partition,才有了并行處理的可能, 不同的PartitionStrategy,其收益不同。最容易想到的就是利用Hash來將整個圖分成多個區域。

  4. outerJoinVertices 頂點的外連接操作


三、圖的運算和操作 GraphOps

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

  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之上屬性的合并,說到合并就不得不扯到關系代數和集合論,所以在VertexRdd中能看到許多類似于sql中的術語,如

  • leftJoin

  • innerJoin


四、GraphX場景分析


1、圖的存儲和加載

在進行數學計算的時候,圖用線性代數中的矩陣來表示,那么如何進行存儲呢?

學數據結構的時候,老師肯定說過好多的辦法,不再啰嗦了。

不過在大數據的環境下,如果圖很巨大,表示頂點和邊的數據不足以放在一個文件中怎么辦? 用HDFS

加載的時候,一臺機器的內存不足以容下怎么辦? 延遲加載,在真正需要數據時,將數據分發到不同機器中,采用級聯方式。

一般來說,我們會將所有與頂點相關的內容保存在一個文件中vertexFile,所有與邊相關的信息保存在另一個文件中edgeFile。

生成某一個具體的圖時,用edge就可以表示圖中頂點的關聯關系,同時圖的結構也表示出來了。

下面是Spark官方示例,用2個Array構造了一個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中專門用于圖的加載和生成,最重要的函數就是edgeListFile。

//以頂點劃分,分成4個分區

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


五、GraphX應用舉例

一行代碼:

val rank = graph.pageRank(0.01).vertices



用RDD實現:

完整代碼

// 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"))




向AI問一下細節

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

AI

屏东市| 汉中市| 西丰县| 张家界市| 聊城市| 闽侯县| 镇赉县| 芜湖县| 隆尧县| 醴陵市| 育儿| 定远县| 潮安县| 商都县| 绍兴市| 石屏县| 灵武市| 吴桥县| 元氏县| 辽中县| 龙胜| 额敏县| 呼和浩特市| 区。| 曲麻莱县| 上蔡县| 瑞安市| 景东| 华安县| 新巴尔虎右旗| 奈曼旗| 凤凰县| 凤台县| 江孜县| 红安县| 澜沧| 资溪县| 思南县| 阿拉善左旗| 会宁县| 盐城市|