Execution:在执行shuffle、join、sort和aggregation时,用于缓存中间数据。通过spark.shuffle.memoryFraction进行配置,默认为0.2。
Storage:主要用于缓存数据块以提高性能,同时也用于连续不断地广播或发送大的任务结果。通过`spark.storage.memoryFraction进行配置,默认为0.6。
Other:这部分内存用于存储运行Spark系统本身需要加载的代码与元数据,默认为0.2。
整体内存划分管理:
1.6版本之前 StaticMemoryManager 内存的分配是静态的,以配置的方式进行设置,对应的管理类为StaticMemoryManager
spark.shuffle.memoryFraction 默认为0.2。
spark.storage.memoryFraction 默认为0.6
spark.shuffle.safeFraction(默认值为0.8)
spark.storage.safeFraction(默认值为0.9)
spark.storage.unrollFraction(默认值为0.2)
从Spark 1.6版本开始 Unified Memory Management
spark.memory.fraction(默认值为0.75)
spark.memory.storageFraction(默认值为0.5)
spark.memory.useLegacyMode(默认值为false)
执行内存管理:
ShuffleMemoryManager、TaskMemoryManager 任务1对1、ExecutorMemoryManager JVM 1对1
存储内存管理:
BlockManager
Storage Level + 是否序列化 ,如 MEMORY_AND_DISK_SER
BlockManager的Unrolling操作,内存倘若不够,会从Storage Memory中借用。这个借用者其实是很霸道的,倘若当前没有Block,他可以借走所有的Storage Memory空间,如果Storage Memory已有block使用,他还会鹊巢鸠占,强制将内存中的block抹去,唯一约束他的是spark.storage.unrollFraction
原文地址:https://zhangyi.gitbooks.io/spark-in-action/content/chapter2/memory_management.html