0


spark内存管理模型

Spark基本流程

1.用户在Driver上创建任务,初始化运行环境
2.Driver根据配置信息,向Resource Manager申请资源
3.Resource Manager资源管理器选择合适的Worker节点创捷Executor
4.Executor向Driver反向注册,并等待任务分配task
5.Driver端完成sparkContext的初始化,创建DAG,将task分配到Executor
6.Executor对task任务进行计算,并将结果返回给Driver

更具上述流程可知,spark主要在JVM上运行的进程有两个分别是driver进程和executor进程,其中主要的数据计算任务是在executor进程上完成的。driver进程主要的内存调整参数时

 -- driver-momery

默认为1G,其需要注意的collect算子,collect会将数据都拉到driver内存中,造成数据的OOM。executor进程在1.6.x版本之前的内存模型为静态内存模型,2.0.x主要使用的内存模型就是动态内存管理模型,其大小的调整参数为

--executor-memory

spark内存管理

spark内存分为堆内内存和堆外内存,堆内内存基于JVM实现,堆外内存通过调用底层的JDK Unsafe API实现,堆外内存默认不开启(其开启参数为spark.memory.offHeap.enabled, 大小参数spark.memory.offHeap.size=1024).

静态内存管理

主要由四个部分组成,分别为:

  • Reserved内存:预留内存,预防OOM,默认分别占Storage内存区域的10%(参数为spark.storage.safetyFraction)及Execution内存区域的20%(参数为spark.suffle.safetyFraction)。
  • Storage内存:用于存储RDD数据以及内存广播数据,当需要用于unroll(缓存Iterator的Block数据)时的内存也是取自于这一部分(大概会占据Storage内存的20%,由spark.storage.unrollFraction参数控制)。默认占spark内存的60%,调整参数为spark.storage.memory。
  • Execution内存:主要用于缓存shuffle过程中的中间数据,默认占spark内存参数的20%,调整参数为spark.shuffle.memory。
  • Other内存:用于存储用户定义的数据结构及spark元数据,其主要占比取决于Storage内存及Execution内存的大小,默认占比20%。

缺点:虽然可以通过手动的方式调整各个内存的占比,但是调整后的shuffle和缓存比例依旧固定,会导致资源不能得到充分的利用。对应的task的内存分配模式为每个task所用的内存平均分配缺少灵活度。

统一内存管理模型

也是主要由四个部分组成,Storage内存与Execution内存统一进行管理(调整参数为spark.memory.fraction)占整个内存减去系统预留内存的60%,分别为:

  • 系统Reserved内存:预留内存,预防OOM,默认大小为300M(参数为spark.suffle.safetyFraction)。
  • Storage内存:用于存储RDD数据以及内存广播数据,当unroll的数据存储不下时会将数据存储到Driver中。默认占统一内存的50%,调整参数为spark.memory.storageFraction。
  • Execution内存:主要用于缓存shuffle过程中的中间数据,默认占统一内存参数的50%,调整参数为spark.memory.storageFraction。
  • Other内存:用于存储用户定义的数据结构及spark元数据,其主要占比取决于Storage内存及Execution内存的大小,默认占比40%。

统一内存管理的规则时

  1. 当内存都不足时,会将数据存储到磁盘中;当二者中有一方内存不足而另一方存储有剩余时,不足的一方会占用剩余一方剩余的内存
  2. 当Storage内存不足时,占据Execution内存时,Execution内存回收时,会让Storage先将占用内存的数据溢写到磁盘中(溢写的规则是LRU),再释放内存
  3. 当Execution内存不足时,借用的Storage内存不返还

对task分配的内存大小取决于正在运行的task数量的多少。


本文转载自: https://blog.csdn.net/weixin_60196805/article/details/134809206
版权归原作者 难得将就 所有, 如有侵权,请联系我们删除。

“spark内存管理模型”的评论:

还没有评论