在火花中,广播如何工作?

洛瓦索阿

这是一个非常简单的问题:在spark中,broadcast可用于高效地将变量发送给执行者。这是如何运作的 ?

更确切地说:

  • 当值发送:只要我打电话broadcast,或者使用的值是什么时候?
  • 数据到底发送到哪里:所有执行者,或仅发送给需要执行者的人?
  • 数据存储在哪里?在内存中还是在磁盘上?
  • 访问简单变量和广播变量的方式是否有所不同?当我调用该.value方法时,在后台发生了什么
洛瓦索阿

简短答案

  • 值在执行程序中首次需要它们时发送。没事的时候被送到sc.broadcast(variable)被调用。
  • 该数据仅发送到包含需要它的执行节点。
  • 数据存储在内存中。如果没有足够的可用内存,则使用磁盘。
  • 是的,访问局部变量和广播变量之间有很大的区别。广播变量必须在首次访问时下载。

长答案

答案在Spark的源代码中TorrentBroadcast.scala

  1. sc.broadcast被调用时,一个新的TorrentBroadcast对象是从实例化BroadcastFactory.scalawriteBlocks()初始化TorrentBroadcast对象时,会在中发生以下情况

    1. 该对象使用该MEMORY_AND_DISK策略在本地未序列化地缓存
    2. 这是序列化。
    3. 序列化版本被分成4Mb的块,被压缩[0] 并保存在本地[1]
  2. 创建新的执行程序时,它们仅具有轻量级TorrentBroadcast对象,该对象仅包含广播对象的标识符及其块数。

  3. TorrentBroadcast对象有一个懒惰[2]属性,它包含其值。value方法被调用,返回此懒财产。所以,第一次遇到这种价值函数被调用的任务时,会发生以下情况:

    1. 在随机顺序,块是从当地块管理器和未压缩牵强。
    2. 如果它们在本地块管理器中不存在,getRemoteBytes则在块管理器上调用以获取它们。网络流量仅在那时发生
    3. 如果该块不在本地存在,则使用进行缓存MEMORY_AND_DISK_SER

[0]的压缩与由默认LZ4。这可以调整

[1]所述的块被存储在本地块管理器,使用MEMORY_AND_DISK_SER,这意味着它溢出,不适合在内存中的磁盘分区每个块都有一个唯一的标识符,该标识符是根据广播变量的标识符及其偏移量计算得出的。块的大小可以配置默认情况下为4Mb。

[2]懒惰VAL在阶是一个变量,其值被评估在第一次被访问,然后高速缓存。查看文档

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章