大数据基础之Spark——Spark pregel详细过程,一看就懂
Pregel概述
- Pregel是Google提出的用于大規模分布式圖計算框架
? - 圖遍歷(BFS)
? - 單源最短路徑(SSSP)
? - PageRank計算 - Pregel的計算由一系列迭代組成,稱為supersteps
- Pregel迭代過程
? - 每個頂點從上一個superstep接收入站消息
? - 計算頂點新的屬性值
? - 在下一個superstep中想相鄰的頂點發送消息
? - 當沒有剩余消息是,迭代結束
Pregel原理分析
pregel函數源碼以及各個參數的簡介:
def pregel[A: ClassTag](initialMsg: A,maxIterations: Int = Int.MaxValue,activeDirection: EdgeDirection = EdgeDirection.Either)(vprog: (VertexId, VD, A) => VD,sendMsg: EdgeTriplet[VD, ED] => Iterator[(VertexId, A)],mergeMsg: (A, A) => A): Graph[VD, ED] = {Pregel(graph, initialMsg, maxIterations, activeDirection)(vprog, sendMsg, mergeMsg)}| initialMsg | 圖初始化的時候,開始模型計算的時候,所有節點都會收到一個消息 |
| maxIterations | 最大迭代次數 |
| activeDirection | 規定了發送消息的方向 |
| vprog | 節點接收改消息將聚合后的數據和本節點進行屬性的合并 |
| sendMsg | 激活狀態節點調用該方法發送消息 |
| mergeMsg | 如果一個節點接收到多條消息,先用mergeMsg來將多條消息聚合成為一條消息,如果節點只收到一條消息,則不調用改函數 |
案例:求5頂點到1頂點的最短距離
- 頂點的兩個狀態:
? - 鈍化態:類似于休眠,不做任何處理
? - 激活態:可以進行數據的接受和發送 - 頂點能夠處于激活狀態需要的條件
? - 成功收到消息
? - 成功發送任何一條消息
首先,給5節點的初始值為0,其他值的初始值為正無窮大
然后從5節點出發,每次用發送方的值+權重和接受方的值相比較,取小值作為接受方的值,然后再以此方式發送給下一節點,如果發送方的值+權重大于接受方的值,則無法發送給下一節點。根據這種方法得到的結果如下圖:
最終得到的5頂點到1頂點的最短距離為15。
代碼實現:
迭代結果展示:
//------------------------------------------ 各個頂點接受初始消息initialMsg ------------------------------------------
頂點3,屬性Infinity,收到消息Infinity,合并后的屬性Infinity
頂點2,屬性Infinity,收到消息Infinity,合并后的屬性Infinity
頂點4,屬性Infinity,收到消息Infinity,合并后的屬性Infinity
頂點6,屬性Infinity,收到消息Infinity,合并后的屬性Infinity
頂點1,屬性Infinity,收到消息Infinity,合并后的屬性Infinity
頂點5,屬性0.0,收到消息Infinity,合并后的屬性0.0
//------------------------------------------ 第一次迭代 ------------------------------------------
頂點5 給 頂點6 發送消息 3.0
頂點5 給 頂點3 發送消息 8.0
頂點3,屬性Infinity,收到消息8.0,合并后的屬性8.0
頂點6,屬性Infinity,收到消息3.0,合并后的屬性3.0
//------------------------------------------ 第二次迭代 ------------------------------------------
頂點3 給 頂點2 發送消息 12.0
頂點2,屬性Infinity,收到消息12.0,合并后的屬性12.0
//------------------------------------------ 第三次迭代 ------------------------------------------
頂點2 給 頂點4 發送消息 14.0
頂點2 給 頂點1 發送消息 19.0
頂點1,屬性Infinity,收到消息19.0,合并后的屬性19.0
頂點4,屬性Infinity,收到消息14.0,合并后的屬性14.0
//------------------------------------------ 第四次迭代 ------------------------------------------
頂點4 給 頂點1 發送消息 15.0
頂點1,屬性19.0,收到消息15.0,合并后的屬性15.0
//------------------------------------------ 第五次迭代不用發送消息 ------------------------------------------
總結
以上是生活随笔為你收集整理的大数据基础之Spark——Spark pregel详细过程,一看就懂的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: houdni 联机渲染解算 hqueue
- 下一篇: CSS折行