2016-04-29 9 views
0

私はGraphXを初めて使用しており、Pregel APIのVertex ProgramとMerge Messageの部分については理解していません。彼らは同じことをしないでください? たとえば、Sparkのウェブサイトから取得した次のPregelコードのVertex ProgramとMerge Messageの違いは何ですか?一つにはGraphXのPregel APIにおける頂点プログラムとMergeメッセージの部分の相違

import org.apache.spark.graphx._ 
// Import random graph generation library 
import org.apache.spark.graphx.util.GraphGenerators 
// A graph with edge attributes containing distances 
val graph: Graph[Long, Double] = 
    GraphGenerators.logNormalGraph(sc, numVertices = 100).mapEdges(e => e.attr.toDouble) 
val sourceId: VertexId = 42 // The ultimate source 
// Initialize the graph such that all vertices except the root have distance infinity. 
val initialGraph = graph.mapVertices((id, _) => if (id == sourceId) 0.0 else Double.PositiveInfinity) 
val sssp = initialGraph.pregel(Double.PositiveInfinity)(
    (id, dist, newDist) => math.min(dist, newDist), **// Vertex Program** 
    triplet => { // Send Message 
    if (triplet.srcAttr + triplet.attr < triplet.dstAttr) { 
     Iterator((triplet.dstId, triplet.srcAttr + triplet.attr)) 
    } else { 
     Iterator.empty 
    } 
    }, 
    (a,b) => math.min(a,b) **// Merge Message** 
) 
println(sssp.vertices.collect.mkString("\n")) 

答えて

1

は、mergeMsg部分は任意のVertexのコンテキストにアクセスできない - それは単に個々のメッセージを受け取り、単一のメッセージを作成します。そのメッセージは、1つのメッセージとしてvprogに送信されます。

したがって、vprogには、個々のメッセージへのアクセス権がありません。の合計が(それが意味するところは何でも)です。また、mergeMsgは2つのメッセージを受け取って1つのメッセージしか作成できません。 mergeMessageはメッセージが1つだけ残るまで発生します。の合計はです。これは私が言ったようにvprogに渡されます。

関連する問題