Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 什么是广播变量?他们解决了什么问题?_Apache Spark - Fatal编程技术网

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

Apache spark 什么是广播变量?他们解决了什么问题?,apache-spark,Apache Spark,我正在浏览Spark编程指南,其中说明: 广播变量允许程序员在每台机器上缓存一个只读变量,而不是将其副本与任务一起发送 综上所述,广播变量的用例是什么?广播变量解决了什么问题 当我们创建如下任何广播变量时,变量引用,在集群中的所有节点中都可用 val broadcastVar = sc.broadcast(Array(1, 2, 3)) 这些变量在节点内存中的可用时间有多长?如果您有从Spark闭包访问的大型数组,例如一些参考数据,则此数组将随闭包一起发送到每个Spark节点。例如,如果您有1

我正在浏览Spark编程指南,其中说明:

广播变量允许程序员在每台机器上缓存一个只读变量,而不是将其副本与任务一起发送

综上所述,广播变量的用例是什么?广播变量解决了什么问题

当我们创建如下任何广播变量时,变量引用,在集群中的所有节点中都可用

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的分布式缓存是正确的吗?唯一的区别是缓存包含文件,而广播变量通常是一个计算值