Spark中内存参数的理解

Spark中内存参数的理解,第1张

Spark中内存参数的理解

最近开始使用 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之外的进程使用。
2. 参数详解 spark.executor.memory
影响 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 所使用的内存大小

未完待续。。。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5685563.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存