首页 > 解决方案 > 在 Spark GraphX 中更新节点属性的最佳结构是什么?

问题描述

有一段时间我正在寻找一种方法来更新 GraphX 中的节点属性。我正在研究一个由节点和节点属性组成的图。例如 (1,(2,true))。在这个例子中,1 是 nodeID,2 是节点的标签,true 代表节点被访问的时间。我已经用 GraphLoader 加载了图表,并通过 RDD 制作了一个分布式图表。

我为每个节点使用的结构如下:

case class nodes_properties(label: Int, isVisited: Boolean = false)
      var work_graph = graph.mapVertices { case (node, property) => nodes_properties(node.toInt, false) }.cache()

当我想更新节点属性(例如它的标签)时,我使用以下结构:

work_graph = work_graph.mapVertices((vid: VertexId, v: nodes_properties) => {
              if (vid == my_node) nodes_properties(newLabel,true)
              else v
            })

这个结构可以满足我的需求,但正如我所见,它的计算成本非常高,仅对于具有 30000 个节点的图,它需要大约 4 分钟,而当我使用 MATLAB 执行相同的操作时,大约需要 25 秒。

问题:在算法过程中是否有任何好的结构或任何有效和理想的方法来更新图中节点的属性?这对我来说真的是一个瓶颈,我无法解决这个问题。

我应该提到该算法具有迭代性质,并且在每次迭代中我需要根据某些条件更新节点属性。

注意:我使用unpersistVertices()并且graph.checkpoint()再次使用这种方法更新节点属性非常耗时!

标签: scalaapache-sparkrddspark-graphx

解决方案


推荐阅读