graphx graph.apply构造函数方法 - 边缘分区

时间:2016-12-09 07:55:54

标签: apache-spark spark-graphx

我有一个带有~340k顶点和~772k边缘的加权图。我从HDFS上的文件构建边缘和顶点RDD。

val verticesRDD : RDD[(VertexId, Long)]

val edgesRDD : RDD[Edge[Double]]

我从这些RDD中使用.apply方法创建了一个图表。

val my_graph: Graph[(Long),Double] = Graph.apply(verticesRDD, edgesRDD)

然后,我为一系列输入计算最短路径算法。这适用于单节点实现。但是,当我在具有多个节点的群集模式下运行时,我没有看到加速或硬件利用率。

阅读文档,我看到“GraphX provides several ways of building a graph from a collection of vertices and edges in an RDD or on disk. None of the graph builders repartitions the graph’s edges by default; instead, edges are left in their default partitions (such as their original blocks in HDFS).

因此,在HDFS上,由于边缘留在原始默认分区中,因此我没有看到加速。

然后我尝试了partitionBy(PartitionStrategy.RandomVertexCut)方法,但这显然无助于重新分区边缘。

我发现使用minEdgePartitions方法构建图表时有一个fromEdgeTuples参数。

如何使用graph.apply构造函数方法对边进行分区?

1 个答案:

答案 0 :(得分:0)

minEdgePartitions使用的fromEdgeTuples参数传递到其RDD构建器,因此在这里要获得相同的结果(分区边),您应该做的是首先构建分区edgeRDD而不是将其传递给graph.apply

val parts = 100
val edgesRDD : RDD[Edge[Double]] = sc.textFile[Edge[Double]]]("/path/to/file", 
                                        minPartitions = parts)
val verticesRDD : RDD[(VertexId, Long)]
val my_graph: Graph[(Long),Double] = Graph.apply(verticesRDD, edgesRDD)