Apache spark 为什么要将spark.Thread.executor.memoryOverhead增加?

Apache spark 为什么要将spark.Thread.executor.memoryOverhead增加?,apache-spark,yarn,Apache Spark,Yarn,我正在尝试连接两个大型spark数据帧,并不断遇到以下错误: 容器因超过内存限制而被纱线杀死。使用22 GB物理内存中的24 GB。考虑升压火花。纱线。执行器。内存开销。< /代码> < /P> 这在spark用户中似乎是一个常见问题,但我似乎找不到任何关于spark.Thread.executor.memoryOverheard是什么的可靠描述。在某些情况下,在Thread杀死容器之前,它听起来像是一种内存缓冲区(例如,请求了10GB,但Thread在使用10.2GB之前不会杀死容器)。在其他

我正在尝试连接两个大型spark数据帧,并不断遇到以下错误:

容器因超过内存限制而被纱线杀死。使用22 GB物理内存中的24 GB。考虑升压火花。纱线。执行器。内存开销。< /代码> < /P>
这在spark用户中似乎是一个常见问题,但我似乎找不到任何关于spark.Thread.executor.memoryOverheard是什么的可靠描述。在某些情况下,在Thread杀死容器之前,它听起来像是一种内存缓冲区(例如,请求了10GB,但Thread在使用10.2GB之前不会杀死容器)。在其他情况下,它听起来像是被用来做一些与我想要执行的分析完全分离的数据核算任务。我的问题是:

  • spark.Thread.executor.memoryOverhead用于什么
  • 增加这种记忆而不是增加记忆有什么好处 执行器内存(或执行器的数量)
  • 总的来说,我可以采取哪些措施来减少我的工作压力 spark.Thread.executor.memoryOverhead用法(例如特殊 数据结构、限制数据帧的宽度、使用更少的执行器和更多的内存等)

    • 开销选项在以下章节中有很好的解释:

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


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

      您能解释什么是插入字符串吗?这是否意味着,当我的数据中有很多字符串时,我会出现内存不足错误,因为我有太多堆外的内部字符串?@Joha String interning是一个过程,在这个过程中,您只存储唯一字符串的一个副本,并在作用域的任何位置使用相同的值时引用它(使用某种形式的查找表)不同的语言选择不同的方法(例如Python实习生只使用短字符串,据我所知是R,Java如果我没有弄错的话,默认情况下实习生
      string
      常量)