我想要做的是将我创建的图形广播到所有顶点,然后每个顶点可以在此图形上进行自己的计算,以计算相对于自身的最短路径作为源顶点?当我尝试访问方法计算中的图形时,下面的代码总是给我:
java.lang.NullPointerException
val result=graph.pregel(graph,Int.MaxValue,EdgeDirection.Out)((id, value, msg) => compute(msg,id),triplet => Iterator.empty,(a, b) => a)
答案 0 :(得分:1)
如果有人试图做同样的事情,这里是对这个问题的回答。
首先,由于GraphX使用RDD来存储图的顶点和边,因此无法以这种方式广播图,因为我们无法访问另一个RDD内的RDD。
这就是为什么您得到java.lang.NullPointerException
的原因。
第二,像这样广播图形是一个坏主意,您可能应该考虑分布式方式来计算每个顶点的最短路径。例如,您可以从每个单个顶点触发最短路径计算,而不必使用一个源顶点,并使用length
和source
标记消息以区分不同的路径。
答案 1 :(得分:0)
除非您有迭代限制,或者想要计算到(暂时)更改节点的最短路径,否则在org.apache.spark.graphx.lib.ShortestPaths
[1]的帮助下计算它可能要容易得多,并且调用此方法在每个顶点上。
无论哪种方式,对于中型图形而言,此内存消耗将不成比例。除非你有一个非常大的集群,或者只有一个小图表,否则这很可能是一项难以逾越的任务。
提供有关您的设置的更多信息可能会改善给出的答案。