《SparkSQL 4》--Spark内存分配

【Spark内存分配详解.pdf】  

   在 Spark 1.5 版本及以前,Spark 采用静态内存管理模型。Spark 1.6 版本推出以后,Spark
   采用了统一内存管理模型。

------静态内存管理:

    Spark  在一个 Executor  中的内存分为三块,一块是 execution  内存,一块是 storage  内存,一块是 other  内存。
《SparkSQL 4》--Spark内存分配_第1张图片

  • 1.storage  内存是存储  broadcast , cache ,persist  数据的地方。其中  10% ( 60% 10% )用于防止  OOM 。另外  90% 中的  20% 用于  unroll ,数据展开的(比如说, rdd.perist  让数据序列化持久化,当要读出来的时候就需要反序列化,可以理解为解压,这就需要  unroll  这部分的内存空间了),其余的内存( 90% 80% )用于 RDD  缓存数据和广播变量。
  • execution  内存是执行内存,文档中说  join,aggregate 都在这部分内存中执行, shuffle的数据也会先缓存在这个内存 中,满了再写入磁盘,能够减少  IO 。其实 map  过程也是在这个内存中执行的。
  • other  内存是程序执行时预留给自己的内存,像 task  的执行和 task 执行时产生的对象。

----------------------------------------------------------------------------------------------------------------------------------------------

------统一内存管理模型:

从 Spark 1.6  版本推出以后,Spark  采用了统一内存管理模型。 Spark 2.1.0  新型 JVM Heap
分成三个部份: Reserved Memory 、 User Memory  和 Spark Memor。

《SparkSQL 4》--Spark内存分配_第2张图片

   1.Reserved Memory(预留内存):默认为300M;
     【org.apache.spark.memory.UnifiedMemoryManager】
      RESERVED_SYSTEM_MEMORY_BYTES = 300 * 1024 * 1024
      作用:用于存储Spark相关定义的参数,如sc,sparksession等
      
    2.User Memory(用户内存):
      作用:用于存储用户级别相关定义的数据,如:参数或变量
      
    3.Spark Memory(Spark内存):
      作用:用于计算(Execution Memory)和cache缓存(Storage Memory)
      
    4.案例说明:
       假如每个executor分配的内存为1G=1024M,那么;
         Reserved Memory = 300M
         User Memory = (1024M-300M)*(1-0.6)  = 724M*0.4  = 289.6M
         Spark Memory = (1024M-300M)*0.6 = 434.4M
                      =Execution Memory(217.2M)+Storage Memory(217.2M) 
                  
                  
    6.在分配executor内存,需考虑最小内存数为:450M
          val minSystemMemory = (reservedMemory * 1.5).ceil.toLong

    7.内存抢占问题:

《SparkSQL 4》--Spark内存分配_第3张图片
      缓存数据大于执行数据(RDD):storage Memory Execution Memory 相互抢占
        
    b.Execution Memory占优,storage Memory必须释放!!
      Execution Memory优先级比较高

你可能感兴趣的:(《SparkSQL 4》--Spark内存分配)