【问题标题】:Broadcasting a graph in Pregel Api in Graphx?在 Graphx 的 Pregel Api 中广播图表?
【发布时间】:2017-03-05 21:12:37
【问题描述】:

我想做的是将我创建的图广播到所有顶点,然后每个顶点可以在该图上进行自己的计算,以计算相对于自身作为源顶点的最短路径?当我尝试在方法计算中访问图形时,下面的代码总是给我: java.lang.NullPointerException

val result=graph.pregel(graph,Int.MaxValue,EdgeDirection.Out)((id, value, msg) => compute(msg,id),triplet => Iterator.empty,(a, b) => a)

【问题讨论】:

  • 您能否展示一个可重现的示例,包括数据和预期输出?

标签: apache-spark spark-graphx


【解决方案1】:

除非您有迭代限制,或者想要计算到(临时)变化节点的最短路径,否则在 org.apache.spark.graphx.lib.ShortestPaths [1] 的帮助下计算它可能要容易得多,并在您的每个节点上调用它顶点。

无论哪种方式,仅对于中等大小的图形,此操作的内存消耗将不成比例。除非您有一个非常大的集群,或者只有一个小图,否则这很可能是一项难以完成的任务。

提供有关您的设置的更多信息可能会改善给出的答案。

【讨论】:

  • 我真正想做的是,如果我们假设诸如中介中心性或所有对最短路径之类的算法或任何需要对图的每个顶点进行计算的算法,那么我们肯定有(对于每个顶点 v 做一些计算)。我只想在一张图上并行执行这个 for 循环
  • 但是那样你就会天生失去对 spark 的优化,因为它的效率在于任务的并行分配。如果您只想在一个图上执行此操作(顺便说一句,这是不可能的,因为 shortestPaths 确实返回另一个图,其中路径长度作为顶点属性无论如何)。问题是您似乎确实忘记了中心性和 pageRank 都有迭代解决方案,并且每个节点没有不同的图
【解决方案2】:

如果有人试图做同样的事情,这里就是这个问题的答案。

首先,由于 GraphX 使用 RDD 来存储图的顶点和边,因此无法以这种方式广播图,因为我们无法访问另一个 RDD 中的 RDD。 这就是您收到java.lang.NullPointerException 的原因。

其次,像这样广播图是一个坏主意,您可能应该考虑 分布式 方法来计算每个顶点的最短路径。例如,您可以从每个顶点触发最短路径计算,并使用lengthsource 标记您的消息,以区分不同的路径,而不是只有一个源顶点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多