我正在阅读Spark编程指南:
广播变量允许程序员在每台机器上保留一个只读变量,而不是随副本一起发送它的副本。
考虑到上述情况,广播变量的用例是什么?广播变量解决了哪些问题?
当我们创建如下所示的任何广播变量时,变量引用,此处集群中的所有节点都可以使用broadcastVar
吗?
val broadcastVar = sc.broadcast(Array(1, 2, 3))
这些变量在节点内存中可用多长时间?
答案 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