繁体   English   中英

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

[英]How to use Broadcast variable correctly in Spark GraphX?

我使用 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

上面的代码(我的意思是 nvalues)是否向集群中的所有从站广播?? 我也应该广播 nvalues 吗? 我对广播主题有点困惑。 请帮我解决这个问题。

有两个问题:

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

all_neighborsall_neighbors类型,它本质上是一个 RDD。 RDD 中没有任何内容可以广播。 RDD是一种数据结构,描述了对某些数据集的分布式计算。 通过RDD的特性,你可以描述计算什么以及如何计算。 它是一个抽象实体。 你只能广播一个真正的值,但 RDD 只是一个值的容器,只有在执行者处理他们的数据时才可用。

引用广播变量

广播变量允许程序员在每台机器上缓存一个只读变量,而不是随任务一起传送它的副本。 例如,它们可用于以有效的方式为每个节点提供大型输入数据集的副本。

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

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

注意:当你执行collect操作时,数据会在driver节点中积累然后广播。 所以如果驱动节点中的空间较少,就会抛出错误

上面的代码(我的意思是 nvalues)是否向集群中的所有从站广播?? 我也应该广播 nvalues 吗?

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

让我知道它是否有帮助!!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM