最近开始使用 pyspark ,对于 executor 中的内存参数有些之前没注意到的地方,查看资料后,这里作下记录。
1. spark 内存划分Spark 的内存分为:
- JVM 内存
- JVM之外的内存
JVM内部的内存分为4部分:
- 存储内存-此内存用于spark缓存数据、广播变量等;
- 执行内存-此内存用于存储执行spark任务期间所需的数据(主要是shuffle阶段);
- 用户内存-此内存用于用户目的。您可以在这里存储自定义数据结构、udf、UDAFs等;
- 保留内存-此内存用于spark用途,从spark 1.6起硬编码为300MB。
JVM之外的内存分为两部分:
- 堆外内存—JVM之外的内存,但用于JVM或用于项目管理;
- 外部进程内存-这个内存是特定于SparkR或PythonR的,由驻留在JVM之外的进程使用。
影响 JVM 内存,是 Spark 为 executor 分配的内存,包含了 存储内存、执行内存、 用户内存、保留内存。spark.memory.fraction
影响 JVM 内存,默认值为0.6。是 executor 中为 存储内存、执行内存 分配内存大小比例 (spark.executor.memory-保留内存(300M))*0.6 = 存储内存+执行内存 (spark.executor.memory-保留内存(300M))*0.4 = 用户内存spark.memory.storageFraction
影响 JVM 内存,默认值为0.5。存储内存、执行内存总和中,存储内存所占的比重,spark 现在 使用的是动态内存管理,在内存空闲时,存储内存、执行内存是可以相互抢占的;在内存使用不足 时,如果存储内存抢占了执行内存,执行内存是可以驱逐存储内存的,反之不行。 这个参数控制着在在内存使用不足时,存储内存可以保留的空间大小。spark.executor.memoryOverhead
影响 堆外 内存,默认值为 executorMemory * 0.10, with minimum of 384。 Spark的shuffle部分使用了netty框架进行网络传输,但netty会申请堆外内存缓存 (PooledByteBufAllocator ,AbstractByteBufAllocator);Shuffle时,每个Reduce 都需要获取每个map对应的输出,当一个reduce需要获取的一个map数据比较大(比如1G),这时 候就会申请一个1G的堆外内存,而堆外内存是有限制的,这时候就出现了堆外内存溢出spark.python.worker.memory
影响 外部进程内存 内存,默认值为 512M 。 JVM进程和Python进程通过py4J桥相互通信,py4J桥公开JVM和Python之间的对象。所以 spark.python.worker.memory在将对象溢出到磁盘之前,控制py4J可以占用多少内存来 创建对象。spark.executor.pyspark.memory
影响 外部进程内存 内存。 限制 每个executor 中 python 所使用的内存大小
未完待续。。。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)