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

For*_*ato 8 hadoop-yarn apache-spark

我正在尝试加入两个大型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.memoryOverheard是什么的任何可靠描述。在某些情况下,这听起来像是在YARN杀死容器之前是一种内存缓冲区(例如,请求10GB,但YARN直到使用10.2GB时才会杀死容器)。在其他情况下,听起来好像它被用来执行某种与我要执行的分析完全分离的数据记帐任务。我的问题是:

  • spark.yarn.executor.memoryOverhead用于什么?
  • 增加这种内存而不是执行程序内存(或执行程序数量)的好处是什么?
  • 总的来说,我是否可以采取一些措施来减少spark.yarn.executor.memoryOverhead的使用(例如,特定的数据结构,限制数据帧的宽度,使用更少的执行器和更多的内存等)?

hi-*_*zir 3

配置文档中很好地解释了开销选项:

这是计算 VM 开销、内部字符串、其他本机开销等内容的内存。它往往会随着执行器大小而增长(通常为 6-10%)。

如果您使用一种非 JVM 来宾语言(Python、R 等),这还包括用户对象。

  • @Joha字符串实习是一个过程,在这个过程中,您仅存储唯一字符串的单个副本,并在范围内的任何地方使用相同的值时引用它(使用某种形式的查找表)不同的语言选择不同的方法(例如Python 只实习生短字符串,据我所知,R 是 Java,如果我没记错的话,默认情况下实习生 `String` 常量。 (2认同)