码迷,mamicode.com
首页 > 其他好文 > 详细

spark内存分配

时间:2021-06-23 17:02:31      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:static   streaming   cme   BMI   结构   占用   溢出   空间   其他   

1.spark内存分配

技术图片

MemoryManager
	|__StaticMemoryManager	静态内存管理机制
	|__UnifiedMemoryManger  统一内存管理机制

1.静态内存管理机制

技术图片

静态内存管理机制实现起来较为简单,但没有根据具体的数据规模和计算任务做相应的配置,很容易造成"一半海水,一半火焰"的局面,即存储内存和执行内存中的一方剩余大量的空间,而另一方却早早被占满,不得不淘汰或移出旧的内容以存储新的内容。由于新的内存管理机制的出现,这种方式目前已经很少有开发者使用,出于兼容旧版本的应用程序的目的,Spark 仍然保留了它的实现。

2.统一内存管理机制

技术图片

  • 统一内存管理机制组成:

    • 系统预留内存(System Reserved)

       默认300M
      
    • Storage内存

      默认占比:50%
      用于缓存RDD(核心),展开partition,存放Direct Task Result、存放广播变量。在Spark Streaming receiver模式中,也用来存放每个batch的blocks。
      
    • Execution内存

      默认占比:50%
      用于shuffle、join、sort、aggregation 等操作中的缓存、buffer。
      存储内存 +  执行内存 ,统一的受管理器管理, 由UnifiedMemoryManager管理。
      
    • 其他内存

      剩余的空间(40%)保留用于用户数据结构,Spark中的内部元数据,并且在稀疏和异常大的记录的情况下保护OOM错误。本块内存,不受MemoryManager管理。
      在spark 运行过程中使用:
      比如序列化及反序列化使用的内存,各个对象、元数据、临时变量使用的内存,函数调用使用的堆栈等。
      
      作为误差缓冲:
      由于storage 和execution 中有很多内存的使用是估算的,存在误差。当storage 或execution 内存使用超出其最大限制时,有这样一个安全的误差缓冲在可以大大减小OOM 的概率。
      
  • 内存使用估算:

当spark-submit ... --executor-memory 1g时候
可用内存为:1024m - 300m   300m为系统预留
统一内存为:可用内存 x 60%
storage 和 execution 各占统一内存一半


最终计算结果:
	storage: (1024 - 300) * 600 * 0.5 = 217m
	execution: (1024 - 300) * 600 * 0.5 = 217m
  • 动态占用机制
    • 核心店:双向占用,单向清除

技术图片

1.如果双方空间都占满了,就溢出到磁盘上
2.双向占用,storage和Execution都可以占用对方的空闲空间
3.单向清除,只有Execution可以清除被storage占用的空间,反之 storage不可以清除占用。

spark内存分配

标签:static   streaming   cme   BMI   结构   占用   溢出   空间   其他   

原文地址:https://www.cnblogs.com/xujunkai/p/14921995.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!