什么是广播变量?他们解决了什么问题?

Ram*_*ana 25 apache-spark

我将通过Spark Programming指南说:

广播变量允许程序员在每台机器上保留一个只读变量,而不是随副本一起发送它的副本.

考虑到上述情况,广播变量的用例是什么?广播变量解决了什么问题?

当我们创建如下所示的任何广播变量时​​,变量引用,这里它broadcastVar可以在集群中的所有节点中使用吗?

val broadcastVar = sc.broadcast(Array(1, 2, 3))
Run Code Online (Sandbox Code Playgroud)

这些变量在节点的内存中可用多长时间?

Eug*_*nev 31

如果您有从Spark Closures访问的大型数组,例如一些参考数据,则此数组将通过闭包发送到每个spark节点.例如,如果您有10个节点群集,其中包含100个分区(每个节点10个分区),则此阵列将至少分发100次(每个节点10次).

如果您使用广播,它将使用高效的p2p协议在每个节点上分发一次.

val array: Array[Int] = ??? // some huge array
val broadcasted = sc.broadcast(array)
Run Code Online (Sandbox Code Playgroud)

还有一些RDD

val rdd: RDD[Int] = ???
Run Code Online (Sandbox Code Playgroud)

在这种情况下,数组每次都会附带封闭

rdd.map(i => array.contains(i))
Run Code Online (Sandbox Code Playgroud)

通过广播,您将获得巨大的性能优势

rdd.map(i => broadcasted.value.contains(i))
Run Code Online (Sandbox Code Playgroud)

  • 为什么节点的每个分区都需要重新获取闭包?为什么不重复使用它? (2认同)