赞
踩
最近开始使用 pyspark ,对于 executor 中的内存参数有些之前没注意到的地方,查看资料后,这里作下记录。
Spark 的内存分为:
JVM内部的内存分为4部分:
JVM之外的内存分为两部分:
影响 JVM 内存,是 Spark 为 executor 分配的内存,包含了 存储内存、执行内存、
用户内存、保留内存。
影响 JVM 内存,默认值为0.6。是 executor 中为 存储内存、执行内存 分配内存大小比例
(spark.executor.memory-保留内存(300M))*0.6 = 存储内存+执行内存
(spark.executor.memory-保留内存(300M))*0.4 = 用户内存
影响 JVM 内存,默认值为0.5。存储内存、执行内存总和中,存储内存所占的比重,spark 现在
使用的是动态内存管理,在内存空闲时,存储内存、执行内存是可以相互抢占的;在内存使用不足
时,如果存储内存抢占了执行内存,执行内存是可以驱逐存储内存的,反之不行。
这个参数控制着在在内存使用不足时,存储内存可以保留的空间大小。
影响 堆外 内存,默认值为 executorMemory * 0.10, with minimum of 384。
Spark的shuffle部分使用了netty框架进行网络传输,但netty会申请堆外内存缓存
(PooledByteBufAllocator ,AbstractByteBufAllocator);Shuffle时,每个Reduce
都需要获取每个map对应的输出,当一个reduce需要获取的一个map数据比较大(比如1G),这时
候就会申请一个1G的堆外内存,而堆外内存是有限制的,这时候就出现了堆外内存溢出
影响 外部进程内存 内存,默认值为 512M 。
JVM进程和Python进程通过py4J桥相互通信,py4J桥公开JVM和Python之间的对象。所以
spark.python.worker.memory在将对象溢出到磁盘之前,控制py4J可以占用多少内存来
创建对象。
影响 外部进程内存 内存。
限制 每个executor 中 python 所使用的内存大小
未完待续。。。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。