这是一个非常简单的问题:在spark中,broadcast
可用于高效地将变量发送给执行者。这是如何运作的 ?
更确切地说:
broadcast
,或者使用的值是什么时候?.value
方法时,在后台发生了什么?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。这可以调整。
[1]所述的块被存储在本地块管理器,使用MEMORY_AND_DISK_SER
,这意味着它溢出,不适合在内存中的磁盘分区。每个块都有一个唯一的标识符,该标识符是根据广播变量的标识符及其偏移量计算得出的。块的大小可以配置;默认情况下为4Mb。
[2]甲懒惰VAL在阶是一个变量,其值被评估在第一次被访问,然后高速缓存。查看文档。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句