2016-04-29 5 views
0

Ich bin neu in GraphX ​​und ich verstehe nicht die Vertex-Programm und Merge Nachricht Teil in Pregel API. Tun sie nicht dasselbe? Zum Beispiel, was ist der Unterschied zwischen Vertex Programm und Merge Nachricht Teil in der folgenden Pregel-Code von der Spark-Website genommen?Unterschied zwischen dem Vertex-Programm und Merge Nachricht Teil in Pregel API in GraphX ​​

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

Antwort

1

Für eine Sache, die mergeMsg Teil keinen Zugriff auf den Kontext jeder Vertex hat - es dauert nur einzelne Nachrichten und erstellt eine einzelne Nachricht. Diese Nachricht wird wiederum an die vprog als eine einzelne Nachricht gesendet.

So hat die vprog keinen Zugriff auf einzelne Nachrichten, nur die Gesamt (was auch immer das bedeutet). Und die mergeMsg kann nur zwei Nachrichten und eine Nachricht erstellen. mergeMessage passiert, bis nur noch eine Nachricht übrig ist - die Gesamt - die, wie gesagt, an vprog übergeben wird.