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

Comparing intersection between two nodes using broadcast variable and using RDD.filter in Spark GraphX

我在 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 计算交集或使用 filtering RDD 方法?

我觉得要视情况而定

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

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

如果有帮助请告诉我!!