概述
spark从1.6.0开始内存管理发生了变化,原来的内存管理由StaticMemoryManager实现,现在被称为Legacy,在1.5.x和1.6.0中运行相同代码的行为是不同的,为了兼容Legacy,可以通过spark.memory.useLegacyMode来设置,默认该参数是关闭的。
spark.memory.useLegacyMode=false
如果采用1.6之前的模型,这会使用StaticMemoryManager来管理,否则使用新的UnifiedMemoryManager。
1.6.0之前的内存组成
我们先看看1.6之前,对于一个Executor,内存都有哪些部分构成:
ExecutionMemory。这片内存区域是为了解决 shuffles,joins, sorts and aggregations 过程中为了避免频繁IO需要的buffer。 通过spark.shuffle.memoryFraction(默认 0.2) 配置。
StorageMemory。这片内存区域是为了解决 block cache(就是你显示调用dd.cache, rdd.persist等方法), 还有就是broadcasts,以及task results的存储。可以通过参数 spark.storage.memoryFraction(默认0.6)。设置
OtherMemory。给系统预留的,因为程序本身运行也是需要内存的。 (默认为0.2).
另外,为了防