Scala Spark GraphX中updaing nodes属性的最佳结构是什么?
有一段时间我一直在寻找更新GraphX中节点属性的方法。我正在处理一个由节点和节点属性组成的图。例如(1,(2,true))。在本例中,1是节点ID,2是节点的标签,true表示访问节点的时间。我用GraphLoader加载了graph,并用RDDs制作了一个分布式图形 我为每个节点使用的结构如下所示:Scala Spark GraphX中updaing nodes属性的最佳结构是什么?,scala,apache-spark,rdd,spark-graphx,Scala,Apache Spark,Rdd,Spark Graphx,有一段时间我一直在寻找更新GraphX中节点属性的方法。我正在处理一个由节点和节点属性组成的图。例如(1,(2,true))。在本例中,1是节点ID,2是节点的标签,true表示访问节点的时间。我用GraphLoader加载了graph,并用RDDs制作了一个分布式图形 我为每个节点使用的结构如下所示: case class nodes_properties(label: Int, isVisited: Boolean = false) var work_graph = graph.
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()
但是我使用的这个方法在更新节点属性时非常耗时 您是否只需要更新一个特定的vertice?在所有顶点上设置了多少个标签?也许您可以在驱动程序端为(vertice id->vertice properties)等对创建缓存,而不是直接标记顶点。我认为最好更改方法,而不是更改数据结构。如果您在所有顶点上只有几个属性,则可以广播它们并在执行器上使用它们。