为什么要增加spark.yarn.executor.memoryOverhead?

17

我正在尝试合并两个大的Spark数据框架,但是一直遇到这个错误:

Container killed by YARN for exceeding memory limits. 24 GB of 22 GB physical memory used. Consider boosting spark.yarn.executor.memoryOverhead.

这似乎是Spark用户中常见的问题,但我似乎找不到关于spark.yarn.executor.memoryOverhead的详细描述。在某些情况下,它似乎是YARN在杀死容器之前的一种内存缓冲区(例如请求了10GB,但YARN在使用10.2GB之前不会杀死容器)。在其他情况下,它似乎用于执行某些与我要执行的分析完全无关的数据账户任务。我的问题是:

  • spark.yarn.executor.memoryOverhead的用途是什么?
  • 增加这种内存的好处是什么,而不是增加executor内存(或executor数量)?
  • 一般来说,有哪些步骤可以减少spark.yarn.executor.memoryOverhead的使用(例如特定的数据结构、限制数据框架的宽度、使用更多内存的较少executor等)?
1个回答

3

配置文档中详细解释了开销选项:

这是指内存占用,包括虚拟机开销、字符串池、其他本地开销等。这通常随执行器大小增长(通常为6-10%)。

如果使用非JVM客户端语言(Python、R等),还包括用户对象。


你能解释一下什么是interned strings吗?这是否意味着,当我的数据中有很多字符串时,我会因为有太多的off heap interned strings而出现内存错误? - Joha
2
@Joha 字符串驻留是一种处理过程,其中您仅存储唯一字符串的单个副本,并在范围内任何地方使用相同值时引用它(使用某种形式的查找表)。不同的编程语言选择不同的方法(例如,Python仅驻留短字符串,据我所知,R驻留所有字符串,如果我没记错的话,Java默认驻留String常量。 - Alper t. Turker
请返回已翻译的文本。在编程中,回调函数是一个可执行的代码块,该代码块作为参数传递给另一个函数,并在必要时被该函数调用。这种技术通常用于异步编程或事件驱动编程中,其中程序需要在某些事件发生后执行操作。回调函数的主要目的是让代码更加模块化和可重复使用。 - pushpavanthar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接