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

时间:2014-11-12 10:37:10

标签: apache-spark

我正在阅读Spark编程指南:

  

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

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

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

val broadcastVar = sc.broadcast(Array(1, 2, 3))

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

2 个答案:

答案 0 :(得分:30)

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

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

val array: Array[Int] = ??? // some huge array
val broadcasted = sc.broadcast(array)

和一些RDD

val rdd: RDD[Int] = ???

在这种情况下,数组每次都会带有闭包

rdd.map(i => array.contains(i))

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

rdd.map(i => broadcasted.value.contains(i))

答案 1 :(得分:0)

广播变量用于在所有节点/执行程序之间发送共享数据(例如,应用程序配置)。

广播值将被缓存在所有执行器中。

在驱动程序上创建广播变量的示例scala代码:

val broadcastedConfig:Broadcast[Option[Config]] = sparkSession.sparkContext.broadcast(objectToBroadcast)

示例scala代码在执行程序端接收广播变量:

val config =  broadcastedConfig.value