如何在Spark GraphX中正确使用Broadcast变量?

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

我使用GraphX处理图形。我使用了GraphLoader来加载它,并使用以下代码制作了一个包含每个节点的邻居的变量:

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

因为我经常需要邻居节点,所以我决定广播它们。当我使用此代码时,出现错误:

val broadcastVar = sc.broadcast(all_neighbors)

但是当我使用此代码时,没有错误:

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

使用collect()进行广播是否正确?

还有一个问题。我想将此广播变量更改为键,值。该代码正确吗?

val nvalues = broadcastVar.value.toMap

以上代码(i表示nvalues)是否广播给集群中的所有从属?我也应该广播nvalues吗?我对广泛的主题有些困惑。请帮助我解决这个问题。

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

有两个问题:

使用collect()进行广播是否正确?

all_neighbors是VertexRDD类型,它本质上是RDD。 RDD中没有任何内容可以广播。 RDD是一种数据结构,描述了一些数据集上的分布式计算。通过RDD的功能,您可以描述计算内容和方法。这是一个抽象实体。您只能广播实际值,但是RDD只是值的容器,仅当执行者处理其数据时才可用。

引自Broadcast Variables

广播变量允许程序员保留只读变量缓存在每台计算机上,而不是附带任务的副本。例如,可以使用它们为每个节点提供一个大型副本。有效地输入数据集。

这意味着显式创建广播变量仅有用当跨多个阶段的任务需要相同的数据或缓存时反序列化形式的数据很重要。

这就是我们需要执行collect RDD所保存的数据集的原因,它将RDD转换为本地可用的集合,然后可以广播该集合。

注意:当您执行collect操作时,数据会累积在驱动程序节点中,然后进行广播。因此,如果驱动程序节点中的空间较小,则会引发错误

是否将上述代码(i表示nvalues)广播给簇??我也应该广播nvalue吗?

这完全取决于您的用例。如果只想使用broadcastVar,则只广播它;或者,如果只想广播nvalues,则只广播nvalues;否则,尽管需要注意内存限制,但您可以广播两个值。

让我知道是否有帮助!

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