这是一个非常简单的问题:在spark中,broadcast
可用于有效地将变量发送给执行程序。这是如何工作的?
更确切地说:
broadcast
,或者何时使用这些值?.value
方法时,幕后会发生什么?答案 0 :(得分:11)
sc.broadcast(variable)
时不会发送任何内容。答案来自Spark的来源TorrentBroadcast.scala
。
调用sc.broadcast
时,将从TorrentBroadcast
实例化一个新的BroadcastFactory.scala
对象。在writeBlocks()
中发生以下情况,在初始化TorrentBroadcast对象时调用:
MEMORY_AND_DISK
策略在本地对对象进行非序列化缓存。创建新的执行程序时,它们只有轻量级TorrentBroadcast
对象,它只包含广播对象的标识符及其块数。
TorrentBroadcast
对象具有包含其值的惰性 [2] 属性。调用value
方法时,将返回此惰性属性。因此,第一次在任务上调用此值函数时,会发生以下情况:
getRemoteBytes
来获取它们。 仅在那时发生网络流量。MEMORY_AND_DISK_SER
进行缓存。[0] 默认情况下压缩为lz4。 This can be tuned
[1] 这些块使用block manager存储在本地MEMORY_AND_DISK_SER
中,这意味着它溢出了不适合的分区内存到磁盘。每个块具有唯一标识符,该标识符根据广播变量的标识符及其偏移量计算。块can be configured的大小;它默认为4Mb。
[2] scala中的 lazy val是一个变量,其值在第一次访问时进行评估,然后进行缓存。 See the documentation
答案 1 :(得分:2)
它: