为什么spark.memory.fraction的默认值这么低?

2024-05-27

来自Spark配置文档 https://spark.apache.org/docs/latest/configuration.html#memory-management,我们了解以下有关spark.memory.fraction配置参数:

用于执行和存储的(堆空间 - 300MB)的一部分。该值越低,溢出和缓存数据驱逐发生的频率就越高。此配置的目的是为内部元数据、用户数据结构以及稀疏、异常大的记录的情况下的不精确大小估计留出内存。建议将此值保留为默认值。

在撰写此问题时,此配置参数的默认值为 0.6。这意味着,对于具有 32GB 堆空间和默认配置的执行器,我们有:

  • 300MB保留空间(硬编码值this https://github.com/apache/spark/blob/0e2d604fd33c8236cfa8ae243eeaec42d3176a06/core/src/main/scala/org/apache/spark/memory/UnifiedMemoryManager.scala#L198 line)
  • (32GB - 300MB) * 0.6 = 19481MB用于执行+存储的共享内存
  • (32GB - 300MB) * 0.4 = 12987MB用户内存

这个“用户记忆”是(根据docs https://github.com/apache/spark/blob/master/docs/tuning.md#memory-management-overview)用于以下用途:

其余空间 (40%) 保留用于用户数据结构、Spark 中的内部元数据,以及在稀疏和异常大的记录情况下防止 OOM 错误。

在具有 32GB 堆空间的执行器上,我们为此分配 12.7GB 内存,这感觉相当大!

做这些用户数据结构/内部元数据/防止 OOM 错误真的需要那么大的空间吗?是否有一些引人注目的用户内存使用示例可以说明如此大的用户内存区域的需求?


我做了一些研究,我认为它的 0.6 不是为了确保用户内存有足够的内存,而是为了确保执行+存储可以适合 jvm 的旧代区域

在这里我发现了一些有趣的事情:火花调谐 https://spark.apache.org/docs/2.0.0/tuning.html

终身代大小由 JVM 的 NewRatio 控制 参数,默认为2,表示终身生成 新生代(堆的其余部分)大小的 2 倍。所以,通过 默认情况下,tenured Generation 占据 2/3 或大约 0.66 堆。 spark.memory.fraction 的值为 0.6 会保留存储空间并 老年代内的执行内存有空闲空间。如果 例如,spark.memory.fraction 增加到 0.8,那么 NewRatio 可能 必须增加到6个或更多。

因此,默认情况下,在 OpenJvm 中,该比率设置为 2,因此老一代有 0,66%,他们选择使用 0,6 来获得较小的余量

我发现在版本 1.6 中这被更改为 0,75 并且它导致了一些问题,这里是吉拉门票 https://issues.apache.org/jira/browse/SPARK-15796

在描述中,您将找到示例代码,该代码将记录添加到缓存只是为了使用为执行+存储保留的整个内存。将存储+执行设置为比旧一代更高的量时,gc 的开销确实很高,并且在旧版本上执行的代码(此设置等于 0.6)快了 6 倍(40-50 秒 vs 6 分钟)

经过讨论,社区决定在 Spark 2.0 中将其回滚到 0.6,这里是PR https://github.com/apache/spark/pull/13618/files有变化

我认为如果你想提高一点性能,你可以尝试将其更改为 0.66,但如果你想有更多的内存用于执行+存储,你还需要调整你的 jvm 并更改旧/新比率,否则你可能会面临性能问题

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

为什么spark.memory.fraction的默认值这么低? 的相关文章

随机推荐

  • 匹配字典集。最优雅的解决方案。 Python

    给定两个字典列表 新的和旧的 字典在两个列表中表示相同的对象 我需要找到差异并生成新的字典列表 其中仅包含新字典中的对象和旧字典中的更新属性 例子 list new id 1 name bob desc cool guy id 2 name
  • 复选框选择与 TableView 绑定

    How to bind with TableView selection model with checkbox isSelected in table view In manually using mouse multiple selec
  • 优化 Django Queryset for 循环

    如何优化以下查询集 link goal for link in self child links all 我想摆脱 for 循环并只访问数据库一次 我有以下代码 class Goal models Model name models Cha
  • PhoneGap BarcodeScanner - ClassNotFound

    UPDATE 2 我发布了一个解决我原来问题的答案 看欲了解更多信息 https stackoverflow com a 9541490 398519 UPDATE供任何想知道的人参考 最后我发现了这个 http github com co
  • 在ios键盘上方显示建议工具栏

    我是iOS开发的新手 我正在尝试在 ios 5 1 中创建一个具有 textView 的拼写建议类型应用程序 这样如果用户点击键盘的某个键 则建议工具栏会出现在键盘顶部 其中包含所有建议 并且如果用户点击这些建议之一它将显示在 textVi
  • 如何使子元素被访问/活动时父元素的颜色发生变化

    我有一个下拉导航 我想要做的是 当我单击任何子菜单链接时 我希望父按钮的颜色在链接处于活动状态时保持更改 这是代码的小提琴链接 https jsfiddle net v28ydshL https jsfiddle net v28ydshL
  • Microsoft.Web.Administration 内存泄漏

    拥有一个 Windows 服务 除其他外 还可以监视 IIS 应用程序池 如果任何池已配置应用程序但未运行 则该池 池 将启动 这已经运行良好一段时间了 最近发现该服务存在内存泄漏 查看内存转储 罪魁祸首是用于检查应用程序池的 Micros
  • 运行最新版本时没有“最新”消息?

    我正在尝试使用Sparkle https sparkle project org与 Qt Go 的绑定 https github com therecipe qt app 闪光 m import
  • Xcode 11 向后兼容性:“UIWindowScene 仅在 iOS 13 或更高版本中可用”

    在 Xcode 11 中 我从 Single View App 模板创建了一个新的应用程序项目 我希望这个应用程序能够在 iOS 12 和 iOS 13 中运行 但是当我将部署目标切换到 iOS 12 时 我收到了很多类似这样的错误消息 U
  • Django + 后台任务如何初始化

    我有一个基本的 django 项目 用作 Condor 计算集群的前端接口来生成模拟 用户可以从 django 应用程序开始模拟 在 Condor 中 与仿真相关的元数据和仿真状态保存在数据库中 我需要添加一个新功能 某些 模拟完成时发出通
  • 区分 Mifare Ultralight 和 Mifare Ultralight C

    有没有可靠的方法来确定 RFID 卡是 Mifare Ultralight 还是 Mifare Ultralight C 到目前为止 我发现的唯一方法是利用这两张卡的大小差异 发出超出较小卡边界的读取命令 但它看起来确实像黑客攻击 我认为如
  • shutdown.exe 参数带有破折号或斜杠?

    我使用的电话shutdown exe重新启动安装了不同版本 Windows 的计算机 对于 Windows XP 命令是 shutdown exe r f t 01 对于其他版本的 Windows 我使用 shutdown exe L R
  • 内存泄漏在哪里?

    我使用 InetAddress 来解析 IP 地址 但现在如果 IP 不可用 则需要存储主机名 所以我介绍了一个班级Host case class Host name String ip InetAddress import Host ad
  • unique_ptr需要存储删除器怎么可能没有开销呢?

    先看看C Primer讲了什么unique ptr and shared ptr 16 1 6 美元 效率和灵活性 我们可以确定的是shared ptr不将删除者视为直接成员 因为删除器的类型直到运行时才知道 因为删除器的类型是a类型的一部
  • KDB 排除具有空值的行

    我有一个表 其中有一些带有空值的单元格 分散在数据集中 有什么简单的方法可以排除任何列中包含空值的所有行吗 我只是想避免这种情况 select from T where not null col1 not null col2 not nul
  • 关闭模态后清除模态字段

    我有这个模式
  • 回形针:从带扩展名的 url 上传

    我想通过 S3 存储上的回形针从 URL 上传图片 我与 Ruby 1 9 3 Rails 3 2 6 paperclip 3 1 3 aws sdk 1 3 9 我有我的图片模型 class Asset has attached file
  • ModuleNotFoundError:没有名为“pandas.io.formats.csvs”的模块

    我正在尝试创建一个简单的 csv dataframe to csv psv file name encoding utf 8 header True sep doublequote True quoting csv QUOTE ALL in
  • beforeRouteUpdate 和观看 '$route' - Vue.js 之间的区别?

    正如我们所知 为了对我们使用的同一组件中的参数变化做出反应beforeRouteUpdate挂钩或观看 route 观看 route const User template watch route to from react to rout
  • 为什么spark.memory.fraction的默认值这么低?

    来自Spark配置文档 https spark apache org docs latest configuration html memory management 我们了解以下有关spark memory fraction配置参数 用于