在 Spark 中,广播是如何工作的?

2024-03-30

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

更确切地说:

  • 何时发送值:我一打电话就发送broadcast,或者何时使用这些值?
  • 数据到底发送到哪里:发送给所有执行者,还是只发送给需要它的执行者?
  • 数据存储在哪里?在内存中,还是在磁盘上?
  • 简单变量和广播变量的访问方式有区别吗?当我致电时,幕后会发生什么.value方法 ?

简短回答

  • 值在执行器第一次需要时发送。没有发送任何内容时sc.broadcast(variable)叫做。
  • 数据仅发送到包含需要它的执行器的节点。
  • 数据存储在内存中。如果没有足够的可用内存,则使用磁盘。
  • 是的,访问局部变量和访问广播变量之间有很大的区别。广播变量必须在第一次访问时下载。

长答案

答案就在 Spark 的源代码中TorrentBroadcast.scala https://github.com/apache/spark/blob/master/core/src/main/scala/org/apache/spark/broadcast/TorrentBroadcast.scala.

  1. When sc.broadcast被称为,一个新的TorrentBroadcast对象实例化自BroadcastFactory.scala。以下情况发生在writeBlocks() https://github.com/apache/spark/blob/master/core/src/main/scala/org/apache/spark/broadcast/TorrentBroadcast.scala#L98,在初始化 TorrentBroadcast 对象时调用:

    1. 该对象使用以下方式在本地缓存非序列化MEMORY_AND_DISK http://spark.apache.org/docs/latest/programming-guide.html#rdd-persistence policy.
    2. 它是连载的。
    3. The serialized version is split into 4Mb blocks, that are compressed[0], and saved locally[1].
  2. 当新的执行者被创建时,他们只有轻量级的TorrentBroadcast对象,仅包含广播对象的标识符及其块数。

  3. The TorrentBroadcast object has a lazy[2] property that contains its value. When the value method is called, this lazy property is returned. So the first time this value function is called on a task, the following happens:

    1. 以随机顺序从本地块管理器获取块并进行解压缩。
    2. 如果它们不存在于本地块管理器中,getRemoteBytes https://github.com/apache/spark/blob/master/core/src/main/scala/org/apache/spark/storage/BlockManager.scala#L567调用块管理器来获取它们。网络流量发生只是在那个时候。
    3. 如果该块在本地不存在,则使用以下命令对其进行缓存MEMORY_AND_DISK_SER http://spark.apache.org/docs/latest/programming-guide.html#rdd-persistence.

[0] Compressed with lz4 by default. This can be tuned http://spark.apache.org/docs/latest/configuration.html#compression-and-serialization.

[1] The blocks are stored in the local block manager https://jaceklaskowski.gitbooks.io/mastering-apache-spark/content/spark-blockmanager.html, using MEMORY_AND_DISK_SER http://spark.apache.org/docs/latest/programming-guide.html#rdd-persistence, which means that it spills partitions that don't fit in memory to disk. Each block has an unique identifier, computed from the identifier of the broadcast variable, and its offset. The size of blocks can be configured http://spark.apache.org/docs/latest/configuration.html#execution-behavior; it is 4Mb by default.

[2] A lazy val in scala is a variable whose value is evaluated the first time it is accessed, and then cached. See the documentation http://www.scala-lang.org/files/archive/spec/2.11/04-basic-declarations-and-definitions.html.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Spark 中,广播是如何工作的? 的相关文章

随机推荐

  • Grails,使用会话中的值注入/填充域对象

    在我的应用程序中 许多类都有公共字段 公司 当应用程序保存该对象时 它们必须填写公司 对此进行了验证 公司也开会 现在 当我想使用域类作为命令对象时 公司必须已填写 否则我会收到验证错误 有什么方法可以在进行任何验证之前始终填写公司字段 这
  • 如何对时间轴上放置的点的值进行插值?

    我想创建不同位置 x 浓度随时间变化的插值图 如果可能的话 我想水平插值点 即随着时间的推移 以便为每个样本获得平滑的变色水平线 df lt data frame Concentration rnorm 30 Position rep c
  • jconn4.jar 的 Maven 存储库是什么?

    jConn3 是我唯一能找到的 com sybase jdbc3 jdbc jconn3 6 05 我的研究告诉我 jconn3 jar 和 jconn4 jar 是 Sybase jConnect 的一部分 为了下载 至少 最新版本的 j
  • “dat”协议能否有效支持视频直播?

    我希望能够通过以下方式实时流式传输视频 或任何其他大型且不断修改 附加的文件 dat Here https github com beakerbrowser webdb performance它说 dat 协议不支持文件级别的部分更新 这意
  • 将数组数据存储在卡中的简单示例

    我想了解如何使用自适应卡读取 写入数据 我可以从提交操作中读取数据 并以文本形式回复 但不确定如何在卡中呈现输入数据 首先 我想将 shotValue 添加到一个数组中 我可以在卡的生命周期中携带该数组 有人可以让我知道该怎么做吗 此问题的
  • 如何使用 html 在新选项卡中打开 pdf 文件的链接

    我有一个 html 页面 其中包含打开 pdf 文件的链接 然而 当我点击这个链接时 它会在 adobe reader 中打开 我已将目标属性设置为空白 但它也不起作用 我想在同一窗口的新选项卡中打开此 pdf 文件 target blan
  • 如何在 MVC 中的单个 foreach 循环中创建水平表?

    在 ASP Net MVC 中 有什么方法可以将以下代码压缩为单个 foreach 循环吗 table class table tr td Name td td td tr tr td Item td tr table
  • Pandas 适用于多列输出的滚动

    我正在编写一个代码 它将滚动窗口应用于将返回多列的函数 输入 熊猫系列预期输出 3 列 DataFrame def fun1 series Some calculations producing numbers a b and c retu
  • Xcode 9.2 中缺少标头搜索路径、库路径和链接路径部分

    想在我的项目的设置面板中添加第三方库路径 但问题是没有标题搜索路径 库路径和链接路径部分 缺少标题搜索路径部分 I am using Xcode 9 2 and Swift 4 点击All and Combined按钮 您会看到标题搜索路径
  • 按长度对数组排序

    我有以下数组 http jsfiddle net 3NZsK http jsfiddle net 3NZsK 我需要按数组的长度对数组进行排序 如何找出数组中最大 第二大 第三大 最小哪一个 例如 我有以下虚拟函数 它可以获取第二大数组 h
  • Facebook 图表 API 与营销 API

    有人可以解释一下 facebook 的图表 API 和营销 API 之间的区别吗 还应该针对哪些请求使用哪一个 我一直在使用 facebook python SDK 来创建广告 但我时不时会遇到速率限制 但在我的营销 API 仪表板中我没有
  • 如何为 eclipse 和 android studio 提供单一的 android SDK 和 AVD

    我是 Eclipse 用户 并在其上轻松开发了 Android 应用程序 但最近 当我看到 android studio 出现并由 android 网站提供时 我想尝试一下 因为它看起来非常有前途 我已经在我的 D 盘中下载了 androi
  • 减少 CosmosDB 的预配置吞吐量

    我有一个 cosmos DB 它在数据库级别配置了 4 个容器和 400 个 RU 我添加了 2 个容器 并且在没有警告的情况下 配置的 RU 增加到了 600 个 下面的文档解释了为什么会发生这种情况 第 4 个以上的每个容器至少需要额外
  • 使用多维 std::initializer_list

    我有一个关于在 C 中使用多维 std intializer list 的问题 我有一个 Matrix 类 我希望能够像这样初始化它 Matrix
  • 通过构建所有 asset_path 值来避免 *.js.erb 文件

    因此 我想避免使用 ERB 处理 JavaScript 文件 这样我就可以获得正确的资源路径 例如图像 目前 这似乎是流行的方法 var myImage 当然 这需要将文件名更改为 erb 以便对其进行处理 我宁愿将 ERB 的丑陋隔离到项
  • rand() 在 C 语言中有多独特?

    我在用rand 对于需要唯一值的 6 位字段 我做对了吗 几率有多大 rand 可以在连续或频繁的通话中给我类似的值吗 当我使用 rand 时 它是独一无二的 但是 当我打电话时返回相同的号码srand time NULL or srand
  • Powershell脚本:无法读取执行程序的返回值

    我正在使用 PowerShell 运行一个执行的脚本wget获取网页 一个简单的数据库导入脚本 并分析其输出 错误消息或 确定 我正在使用答案中的代码上一个问题 https stackoverflow com questions 20345
  • 最新的浏览器中有内置的 javascript 字符串哈希函数吗?

    每当新版本的浏览器出现时 我都会听到添加新的东西 比如 webGL 和其他没有人真正知道它们是否能赶上的技术 但我想知道是否有人考虑过 JS 中的哈希函数 MD5 SHA1 等 等基本内容 我所说的最新浏览器也指当今的开发版本 例如 Ope
  • 如何使用 EF 6.0 中的代码优先方法从 sql 表中删除列?

    我错误地在数据库中添加了一列 名为doj现在 如果我想使用代码优先方法从表中删除该列 我应该做什么 我已经尝试过这些事情 1 从模型中删除列定义 2 删除了迁移历史记录 3 添加迁移4 更新数据库 但它仍然没有反映在数据库中 我哪里犯了错误
  • 在 Spark 中,广播是如何工作的?

    这是一个非常简单的问题 在 Spark 中 broadcast可用于有效地将变量发送给执行器 这是如何运作的 更确切地说 何时发送值 我一打电话就发送broadcast 或者何时使用这些值 数据到底发送到哪里 发送给所有执行者 还是只发送给