比较两个节点之间的广播变量和Spark GraphX中使用RDD.filter的交集

问题描述 投票:1回答:1

i在GraphX中处理图形。通过使用下面的代码,我做了一个变量来存储RDD中节点的邻居:

val all_neighbors: VertexRDD[Array[VertexId]] = graph.collectNeighborIds(EdgeDirection.Either)

我使用广播变量通过使用以下代码向所有从站广播邻居:

val broadcastVar = all_neighbors.collect().toMap
val nvalues = sc.broadcast(broadcastVar)

我想计算两个节点邻居之间的交集。例如节点1和节点2邻居之间的交集。

起初,我使用此代码来计算使用广播变量nvalues的交集:

val common_neighbors=nvalues.value(1).intersect(nvalues.value(2))

并且一旦我使用以下代码来计算两个节点的交集:

val common_neighbors2=(all_neighbors.filter(x=>x._1==1)).intersection(all_neighbors.filter(x=>x._1==2))

我的问题是:以上方法中哪一种是有效的,分布更分散和并行的?使用广播变量nvalue计算交集还是使用过滤RDD方法?

scala apache-spark spark-graphx
1个回答
0
投票

我认为这取决于情况。

如果您的nvalues大小较小并且可以适合每个执行者和驱动程序节点,则广播方法将是最佳的,因为数据被缓存在执行者中,并且不会一次又一次地重新计算这些数据。而且,它将节省大量通信和计算负担。在这种情况下,另一种方法不是最佳方法,因为每次都可能会计算all_neighbours rdd,这会降低性能,因为会有大量的重新计算,并且会增加计算成本。

[如果您的nvalues无法放入每个执行程序和驱动程序节点,广播将无法工作,因为它将引发错误。因此,别无选择,只能使用第二种方法,尽管它仍然可能会导致性能问题,至少代码会起作用!

让我知道是否有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.