在spark中,spark.executor.pyspark.memory配置选项的含义是什么?

kwvwclae  于 2023-06-21  发布在  Spark
关注(0)|答案(1)|浏览(171)

文件说明如下:
在每个执行器中分配给PySpark的内存量,除非另有说明,否则以MiB为单位。如果设置了这个值,那么执行程序的PySpark内存将被限制在这个值内。如果不设置,Spark将不会限制Python的内存使用,而应用程序可以避免超出与其他非JVM进程共享的内存空间。当PySpark在YARN或Kubernetes中运行时,该内存会添加到executor资源请求中。注意:此功能依赖于Python的resource模块;因此,行为和局限性是遗传的。例如,Windows不支持资源限制,实际资源在macOS上不受限制。
还有两个其他配置选项。一个控制分配给每个执行器的内存量-spark.executor.memory,另一个控制执行器中的每个Python进程在开始将内存溢出到磁盘之前可以使用的内存量-spark.python.worker.memory
有人能解释一下spark.executor.pyspark.memory配置的行为和用途是什么吗?它与spark.executor.memoryspark.python.worker.memory有什么不同?

qaxu7uf2

qaxu7uf21#

我的回答稍微有点夸张。请点击文章最后的链接,这些链接非常有用,其中有一些图片有助于理解Spark内存管理的全貌。

我们应该深入研究spark内存管理(mm),以弄清楚什么是spark. execution. pyspark. memory。
所以,首先spark mm有两大部分:

  • JVM内部的内存;
  • JVM外部的内存。

JVM中的内存分为4个部分:

  • 存储内存--这个内存用于spark缓存的数据、广播变量等;
  • 执行存储器-该存储器用于存储执行Spark任务期间所需的数据;
  • 用户存储器-此存储器用于用户目的。您可以在这里存储您的自定义数据结构、UDF、UDAF等;
  • 保留内存-这个内存是用于spark的,从spark 1.6开始它被硬编码为300 MB。

JVM外部的内存分为两部分:

  • OffHeap内存-JVM之外的内存,但用于JVM目的或此内存用于Project Tungsten;
  • 外部进程内存-此内存特定于SparkR或PythonR,并由驻留在JVM外部的进程使用。

因此,参数spark.executor.memory(或**--executor-memory**用于spar-submit)响应每个exectuor将在JVM Heap中分配多少内存。此内存将在以下两个部分之间拆分:保留存储器、用户存储器、执行存储器、存储存储器。为了控制这种分裂,我们需要另外两个参数:spark.memory.fraction和spark.memory.storageFraction
根据Spark文档:

spark.memory.fraction负责堆中用于执行和存储的部分;
spark.memory.storageFraction负责不受驱逐的存储内存量,表示为spark. memory. fraction留出的区域大小的分数。因此,如果存储内存未被使用,则执行内存可以获取所有可用内存,反之亦然。此参数控制在必要时可以收回多少内存执行。

更多详情
Please look pictures of Heap memory parts here
最后,Heap将以下一种方式拆分:

  • 保留内存硬编码为300 MB
  • 用户内存将计算为(spark.executor.memory-保留内存)*(1 -spark.memory.fraction
  • Spark内存(由存储内存和执行内存组成)将计算为(spark.executor.memory- reserved memory)*spark.memory.fraction。然后,所有这些内存将通过spark.memory.storageFraction参数在存储内存和执行内存之间分割。

您询问的下一个参数是spark.executor.pyspark.memory。它是外部进程内存的一部分,负责Python守护进程能够使用多少内存。例如,Python守护进程用于执行在python上编写的UDF。
最后一个是spark.python.worker.memory。在这个article中,我找到了下一个解释:JVM进程和Python进程通过py4J bridge相互通信,py4J bridge公开JVM和Python之间的对象。所以spark.python.worker.memory控制py 4J在创建对象之前可以占用多少内存。
你可以在接下来的文章中阅读更多关于mm的内容:

相关问题