• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Spark内存参数的理解

武飞扬头像
ztcheck
帮助1

最近开始使用 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 所使用的内存大小

未完待续。。。

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgacabk
系列文章
更多 icon
同类精品
更多 icon
继续加载