当前位置:首页 > 内存 > 正文

spark内存模型

  • 内存
  • 2024-06-03 14:06:18
  • 7991

一、spark内存模型和执行计划过程

存储内存用于广播和缓存数据:
存储堆内存=(–300MB)**eFraction

执行Shuffle、Join、Sort等计算时的临时数据:
执行堆内存=(–300MB)*spark内存。fraction*(eFraction)

other:主要用于存储RDD转换操作所需的数据,如RDD依赖关系等信息:

ReservedMemory:系统保留内存将用于存储Spark内部对象

堆外的内存:一个是DirectMemory,另一个是JVMOverhead。主要用于共享库、PermSpace、线程堆栈和一些内存映射程序,或者像C这样的分配对象


二、spark内存溢出及其解决方案1.你在工作中遇到过内存溢出问题吗?你是怎么解决的?
回答思路:先解释一下spark内存模型,然后给出不同情况下的解决方案。总体思路是根据内存模型找出哪部分内存不足,要么增加比例,要么增加总量。
oom通常发生在执行内存中,因为存储内存满后,内存中的旧数据会直接转储,对性能会有轻微影响,但不会造成oom。存储内存和执行内存可以互相借用内存空间。
Spark的OOM问题主要分为三种情况:
①map执行后内存锁
--场景:map的任务执行填充可执行内存。
当增加堆上的内存时,堆外申请的内存也会增加
--可执行内存
增加disable-堆内存
overhead2048
应用于堆外内存的默认值为执行程序内存的10%。
②shuffle后内存溢出
Reducetask去map取数据,同时聚合。减少一侧有聚合内存的分数,executormemory*0.2
解决方案:增加聚合内存的减少百分比,设置fraction
增加内存sizeExecutive
减少reducer任务每次抓取的数据量,设置eInFlight24m
③驱动内存溢出
--场景一:用户在Dirver端口对象中生成大量数据,如创建大集合数据结构
解决方案:Ⅰ将大对象转换为可执行侧加载,例如文件调用
二估计大内存对象占用情况,增加dirver-menory的值
--场景2:从Executor端收集数据(collect)回Dirver端
解决方案:Ⅰ不建议大量传输数据从可执行端收集。建议执行器将驱动端对集合返回的数据的操作转换为RDD操作
   Ⅱ如果无法避免,估计集合所需的内存,增大该值driver的-内存相应
--场景3:消耗spark框架本身
主要是被sparkUI数据消耗,取决于工作任务的累计数量
解决方案:Ⅰ通过hdfsload自动计算分区,但经过过滤后,数据量已经大大减少,此时可以减少分区。
    Ⅱ由参数edStages/edjobs控制(默认1000)
刷新错误可能是什么原因?
出现该错误的原因可能是下一个stage的任务从上一个stage的任务所在的executor拉取数据,而上一个stage正在运行GC,导致没有通道拉取数据,导致发生错误。可以通过调整提款次数和间隔来避免这种情况。
valconf=newSparkConf()
.set("ries","6')
.set("ait","60s")
3.堆栈溢出?
在jarn-client模式下,Dirver在本地机器上运行,从jvm激发PermGen使用的是128m在客户端测试时可能没有问题
在yarn-cluster模式下Dirver运行在集群中的一个节点上,使用未配置的配置构建大小为82m。运行时文件溢出
--解决办法:在spark-submit脚本中设置相关参数
-xx:PerSize=128M-xx:MaxPermSize=256m"


三、spark工作原理和介绍