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

fig*_*uts 7 apache-spark pyspark

文档解释如下:

除非另有指定,否则在每个执行器中分配给 PySpark 的内存量(以 MiB 为单位)。如果设置,执行程序的 PySpark 内存将限制为此数量。如果未设置,Spark 将不会限制 Python 的内存使用,并且由应用程序来避免超出与其他非 JVM 进程共享的开销内存空间。当 PySpark 在 YARN 或 Kubernetes 中运行时,此内存将添加到执行器资源请求中。注意:该功能依赖于Python的resource模块;因此,行为和限制是遗传的。例如,Windows不支持资源限制,而macOS上实际资源不受限制。

还有其他两个配置选项。一个控制分配给每个执行器的内存量spark.executor.memory,另一个控制执行器中的每个 python 进程在开始将内存溢出到磁盘之前可以使用的内存量。spark.python.worker.memory

有人可以解释一下配置的行为和使用是什么以及它与andspark.executor.pyspark.memory有什么不同吗?spark.executor.memoryspark.python.worker.memory

小智 14

我稍微扩展了我的答案。请点击文章末尾的链接,它们非常有用,并且有一些图片可以帮助您了解 Spark 内存管理的整体情况。

\n
\n

我们应该深入研究 Spark 内存管理(mm)来弄清楚什么是 Spark.execution.pyspark.memory。

\n

那么,首先spark mm有两大部分:

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

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

\n
    \n
  • Storage内存——该内存用于spark缓存数据、广播变量等;
  • \n
  • 执行内存——该内存用于存储执行spark任务时所需的数据;
  • \n
  • 用户内存 - 该内存供用户使用。您可以在这里存储您的自定义数据结构、UDF、UDAF 等;
  • \n
  • 保留内存 - 该内存用于 Spark 目的,从 Spark 1.6 开始硬编码为 300MB。
  • \n
\n

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

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

因此,参数spark.executor.memory(或--executor-memory for spar-submit)响应将在每个执行器的JVM堆内分配多少内存。该内存将分为:保留内存、用户内存、执行内存、存储内存。为了控制这种分裂,我们还需要 2 个参数:spark.memory.fraction 和 Spark.memory.storageFraction

\n

根据火花文档:

\n
\n

Spark.memory.fraction负责用于执行和存储的堆的一部分;

\n
\n
\n

Spark.memory.storageFraction负责不受逐出影响的存储内存量,表示为由spark.memory.fraction 预留的区域大小的一部分。因此,如果不使用存储内存,执行内存可能会获取所有可用内存,反之亦然。此参数控制执行时可以在必要时逐出多少内存。

\n
\n

更多详情请点击此处

\n

请在此处查看堆内存部分的图片

\n
\n

最后,堆将通过以下方式进行分割:

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

您询问的下一个参数是spark.executor.pyspark.memory。它是外部进程内存的一部分,负责 python 守护进程能够使用多少内存。例如,Python 守护进程用于执行在 python 上编写的 UDF。

\n
\n

最后一个是spark.python.worker.memory。在这篇文章中,我找到了下一个解释:JVM 进程和 Python 进程通过py4J 桥 相互通信, 该桥在 JVM 和 Python 之间公开对象。因此,spark.python.worker.memory正在控制 py4J 在将对象溢出到磁盘之前可以占用多少内存来创建对象。

\n

您可以在接下来的文章中了解更多有关 mm 的内容:

\n\n