美文网首页
spark2.x--7. 内存管理之StaticMemoryMa

spark2.x--7. 内存管理之StaticMemoryMa

作者: shuitai | 来源:发表于2018-02-22 10:29 被阅读0次

    1. MemoryManager

    Spark的内存主要分为管理储存(Storage)和执行(Execution),ExecutionMemory是指 Shuffles,joins,sorts和 aggregation 的操作;而StorageMemory 是缓存和广播数据相关的,每一个 JVM 会产生一个 MemoryManager 来负责管理内存。

    MemoryManager 主要有几个功能:

    •记录用了多少 StorageMemory 和ExecutionMemory

    •申请 Storage、Execution 和Unroll Memory

    •释放 Storage 和ExecutionMemory

    其中MemoryManger有两个实现类,StaticMemoryManager和UnifiedMemoryManager。

    图 1  MemoryManger类图 

    2. StaticMemoryManager

    今天我们先看看StaticMemoryManager,以下是ExecutionMemory,StorageMemory,UrollMemory在StaticMemoryManager的分配。

    图 2 StaticMemoryManager内存管理图示——堆内

    对应的代码如下:

    其中 systemMaxMemory 取决于当前 JVM 堆内内存的大小,最后可用的执行内存或者存储内存要在此基础上与各自的memoryFraction 参数和 safetyFraction 参数相乘得出。上述计算公式中的两个 safetyFraction 参数,其意义在于在逻辑上预留出1-safetyFraction 这么一块保险区域,降低因实际内存超出当前预设范围而导致 OOM 的风险(上文提到,对于非序列化对象的内存采样估算会产生误差)。值得注意的是,这个预留的保险区域仅仅是一种逻辑上的规划,在具体使用时 Spark 并没有区别对待,和"其它内存"一样交给了 JVM 去管理。

    堆外的空间分配较为简单,只有存储内存和执行内存,如图 3 所示。可用的执行内存和存储内存占用的空间大小直接由参数 spark.memory.storageFraction 决定,由于堆外内存占用的空间可以被精确计算,所以无需再设定保险区域。

    图 3  StaticMemoryManager内存管理图示——堆外

    对应的代码在MemoryManager.scala:

    StaticMemoryManager申请StorageMemory见方法acquireStorageMemory

    StaticMemoryManager申请ExecutionMemory见方法acquireExecutionMemory

    StaticMemoryManager申请UnrollMemory见方法acquireUnrollMemory

    MemoryManager 的具体实现上,Spark 1.6 之后默认为统一管理(Unified Memory Manager)方式,1.6 之前采用的静态管理(Static Memory Manager)方式仍被保留,可通过配置 spark.memory.useLegacyMode 参数启用。

    相关文章

      网友评论

          本文标题:spark2.x--7. 内存管理之StaticMemoryMa

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