Python 皮斯帕克。spark.Thread.executor.memoryOverhead和spark.executor.pyspark.memory之间的相关性

Python 皮斯帕克。spark.Thread.executor.memoryOverhead和spark.executor.pyspark.memory之间的相关性,python,apache-spark,pyspark,Python,Apache Spark,Pyspark,在使用PySpark 2.4.0和MlFlow提供ml模型时,我遇到了一个问题 执行器失败,出现以下异常: org.apache.spark.util.TaskCompletionListenerException:内存被查询泄漏。内存泄漏:(2048)分配器(stdin reader for./my job impl condaenv.tar.gz/bin/python)0/2048/8194/9223372036854775807(res/actual/peak/limit) 从关于PySp

在使用PySpark 2.4.0和MlFlow提供ml模型时,我遇到了一个问题

执行器失败,出现以下异常:

org.apache.spark.util.TaskCompletionListenerException:内存被查询泄漏。内存泄漏:(2048)分配器(stdin reader for./my job impl condaenv.tar.gz/bin/python)0/2048/8194/9223372036854775807(res/actual/peak/limit)

从关于PySpark的文章中,我了解到以下几点:

  • spark为每个执行器的每个核心运行至少一个python进程
  • spark.executor.memory
    参数仅配置JVM内存限制,不影响python进程
  • python工作进程从执行器开销中消耗内存,使用
    spark.warn.executor.memoryOverhead配置
    
  • 自spark 2.4.0以来,我们可以使用
    spark.executor.pyspark.memory
    显式地为python工作者保留内存,这使我们能够更精确地规划内存,并停止使用
    spark.warn.executor.memoryOverhead
    下面是对官方文档中的
    spark.executor.pyspark.memory
    的解释:

    除非另有规定,否则每个执行器中要分配给PySpark的内存量(以MiB为单位)。如果设置,执行器的PySpark内存将限制在此数量。如果未设置,Spark将不会限制Python的内存使用,并且由应用程序来避免超出与其他非JVM进程共享的开销内存空间。当PySpark在Thread或Kubernetes中运行时,该内存将添加到执行器资源请求中

    起初,我只是使用
    spark.warn.executor.memoryOverhead
    增加了内存量,错误终于消失了

    然后,我决定让事情变得更好,并使用导致相同错误的
    spark.executor.pyspark.memory
    为python worker指定内存量

    所以,我似乎没有正确理解spark.executor.pyspark.memory的具体配置,以及它与spark.Thread.executor.memoryOverhead的关联

    我对PySpark没有太多的经验,所以我希望您能帮助我理解PySpark中的内存分配过程,谢谢