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方法?
我认为这取决于情况。
如果您的nvalues
大小较小并且可以适合每个执行者和驱动程序节点,则广播方法将是最佳的,因为数据被缓存在执行者中,并且不会一次又一次地重新计算这些数据。而且,它将节省大量通信和计算负担。在这种情况下,另一种方法不是最佳方法,因为每次都可能会计算all_neighbours
rdd,这会降低性能,因为会有大量的重新计算,并且会增加计算成本。
[如果您的nvalues
无法放入每个执行程序和驱动程序节点,广播将无法工作,因为它将引发错误。因此,别无选择,只能使用第二种方法,尽管它仍然可能会导致性能问题,至少代码会起作用!
让我知道是否有帮助!