美文网首页
spark统一内存管理器UnifiedMemoryManager

spark统一内存管理器UnifiedMemoryManager

作者: 藤风 | 来源:发表于2019-12-21 09:39 被阅读0次

    在1.6版本之前spark采用静态内存管理器StaticMemoryManager进行内存管理,而在之后spark采用统一内存管理器UnifiedMemoryManager进行内存管理,可以对内存进行动态管理,提高了内存的利用率。

    1、spark内存模型

    object UnifiedMemoryManager {
    
      // Set aside a fixed amount of memory for non-storage, non-execution purposes.
      // This serves a function similar to `spark.memory.fraction`, but guarantees that we reserve
      // sufficient memory for the system even for small heaps. E.g. if we have a 1GB JVM, then
      // the memory used for execution and storage will be (1024 - 300) * 0.6 = 434MB by default.
      private val RESERVED_SYSTEM_MEMORY_BYTES = 300 * 1024 * 1024
    
      def apply(conf: SparkConf, numCores: Int): UnifiedMemoryManager = {
        val maxMemory = getMaxMemory(conf)
        new UnifiedMemoryManager(
          conf,
          maxHeapMemory = maxMemory,
          onHeapStorageRegionSize =
            (maxMemory * conf.getDouble("spark.memory.storageFraction", 0.5)).toLong,
          numCores = numCores)
      }
    
      /**
       * Return the total amount of memory shared between execution and storage, in bytes.
       */
      private def getMaxMemory(conf: SparkConf): Long = {
        val systemMemory = conf.getLong("spark.testing.memory", Runtime.getRuntime.maxMemory)
        val reservedMemory = conf.getLong("spark.testing.reservedMemory",
          if (conf.contains("spark.testing")) 0 else RESERVED_SYSTEM_MEMORY_BYTES)
        val minSystemMemory = (reservedMemory * 1.5).ceil.toLong
        if (systemMemory < minSystemMemory) {
          throw new IllegalArgumentException(s"System memory $systemMemory must " +
            s"be at least $minSystemMemory. Please increase heap size using the --driver-memory " +
            s"option or spark.driver.memory in Spark configuration.")
        }
        // SPARK-12759 Check executor memory to fail fast if memory is insufficient
        if (conf.contains("spark.executor.memory")) {
          val executorMemory = conf.getSizeAsBytes("spark.executor.memory")
          if (executorMemory < minSystemMemory) {
            throw new IllegalArgumentException(s"Executor memory $executorMemory must be at least " +
              s"$minSystemMemory. Please increase executor memory using the " +
              s"--executor-memory option or spark.executor.memory in Spark configuration.")
          }
        }
        val usableMemory = systemMemory - reservedMemory
        val memoryFraction = conf.getDouble("spark.memory.fraction", 0.6)
        (usableMemory * memoryFraction).toLong
      }
    }
    

    spark堆内内存可以分为预留内存及可用内存两部分,其中预留内存为300M,可用内存分为两部分,一部分为用户内存,主要用于存储RDD转换操作所需要的数据,另一部分内存(可用内存\timesspark.memory.fraction)分为exexution内存及storage内存(可用内存\timesspark.memory.fraction\timesspark.memory.storageFraction)。在spark2.4版本中,spark.memory.fraction及spark.memory.storageFraction默认值分别为0.6及0.5。举个例子,executor-memory设置为2g时,storage内存及execution内存一共为(2048-300)\times0.6=1048.8M

    捕获.PNG spark内存模型

    2、storage/execution动态占用机制

     * Storage can borrow as much execution memory as is free until execution reclaims its space.
     * When this happens, cached blocks will be evicted from memory until sufficient borrowed
     * memory is released to satisfy the execution memory request.
     *
     * Similarly, execution can borrow as much storage memory as is free. However, execution
     * memory is *never* evicted by storage due to the complexities involved in implementing this.
     * The implication is that attempts to cache blocks may fail if execution has already eaten
     * up most of the storage space, in which case the new blocks will be evicted immediately
     * according to their respective storage levels.
    

    上面为spark源码中unifiedMemoryManager中的注释,大致意思当storage内存不足且execution有多余内存时,storage可以借用execution的内存,execution内存不足时会强制收回被storage占用的内存;同理,execution内存不足时也可以借用storage的内存,但是storage不会强制收回被execution占用的内存。

    相关文章

      网友评论

          本文标题:spark统一内存管理器UnifiedMemoryManager

          本文链接:https://www.haomeiwen.com/subject/nlzunctx.html