文件说明如下:
在每个执行器中分配给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.memory
和spark.python.worker.memory
有什么不同?
1条答案
按热度按时间qaxu7uf21#
我的回答稍微有点夸张。请点击文章最后的链接,这些链接非常有用,其中有一些图片有助于理解Spark内存管理的全貌。
我们应该深入研究spark内存管理(mm),以弄清楚什么是spark. execution. pyspark. memory。
所以,首先spark mm有两大部分:
JVM中的内存分为4个部分:
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将以下一种方式拆分:
您询问的下一个参数是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的内容: