Apache spark 什么是广播变量?他们解决了什么问题?
我正在浏览Spark编程指南,其中说明: 广播变量允许程序员在每台机器上缓存一个只读变量,而不是将其副本与任务一起发送 综上所述,广播变量的用例是什么?广播变量解决了什么问题 当我们创建如下任何广播变量时,变量引用,在集群中的所有节点中都可用Apache spark 什么是广播变量?他们解决了什么问题?,apache-spark,Apache Spark,我正在浏览Spark编程指南,其中说明: 广播变量允许程序员在每台机器上缓存一个只读变量,而不是将其副本与任务一起发送 综上所述,广播变量的用例是什么?广播变量解决了什么问题 当我们创建如下任何广播变量时,变量引用,在集群中的所有节点中都可用 val broadcastVar = sc.broadcast(Array(1, 2, 3)) 这些变量在节点内存中的可用时间有多长?如果您有从Spark闭包访问的大型数组,例如一些参考数据,则此数组将随闭包一起发送到每个Spark节点。例如,如果您有1
val broadcastVar = sc.broadcast(Array(1, 2, 3))
这些变量在节点内存中的可用时间有多长?如果您有从Spark闭包访问的大型数组,例如一些参考数据,则此数组将随闭包一起发送到每个Spark节点。例如,如果您有10个节点集群,其中包含100个分区(每个节点10个分区),则此阵列将至少分布100次(每个节点10次) 如果您使用广播,它将使用高效的p2p协议在每个节点上分发一次
val数组:数组[Int]=???//一些巨大的阵列
val broadcasted=sc.broadcast(数组)
还有一些RDD
val-rdd:rdd[Int]=???
在这种情况下,每次都将随闭包一起提供阵列
rdd.map(i=>array.contains(i))
通过广播,您将获得巨大的性能优势
rdd.map(i=>broadcasted.value.contains(i))
广播变量用于跨所有节点/执行器发送共享数据(例如应用程序配置)
广播值将缓存在所有执行器中
在驱动程序处创建广播变量的scala代码示例:
val broadcastedConfig:Broadcast[Option[Config]] = sparkSession.sparkContext.broadcast(objectToBroadcast)
在执行器端接收广播变量的scala代码示例:
val config = broadcastedConfig.value
为什么节点的每个分区都需要重新获取闭包?为什么不重用上一篇文章中的内容呢?@samthebest文档很好地涵盖了这个案例IMO(第二段):但是如果你需要源代码,我可以重新挖掘(我忘了)@JustinPihony如果你阅读文档,很明显它不是自动的。它自动以序列化的形式而不是反序列化的形式广播数据,对于反序列化的形式,您需要显式。如果您有一个在5个节点上有5000个任务的作业,并且您广播一个100 GB的哈希映射以用作查找,那么通过使用BV,您将节省1000倍的反序列化成本(如果您关闭了序列化压缩,则会节省大量内存)。。。。。。。,反序列化本身的实际成本是非常内存密集型的,我已经看到各种作业都被OOM(挂起后)所占用,阅读ST可以看到它在反序列化过程中发生。最后,在单个JVM中1000次描述100GB内存将导致疯狂的GC。因此,“这几乎就是Spark现在所做的…”是不正确的,BVs仍然应该被明确使用。广播值类似于Hadoop的分布式缓存是正确的吗?唯一的区别是缓存包含文件,而广播变量通常是一个计算值