MemoryManager将堆空间静态分区为不相交的区域。分别通过spark.shuffle.memoryFraction
和spark.storage.memoryFraction
来确定执行和存储区域的大小 。这两个区域是完全分离的,使得两者都不能从另一个借用内存。
例如Executor的可用Heap大小是10G,实际上Spark只能使用90%,也就是9G的大小,是由spark.storage.safetyFraction来控制。
Spark1.6.X以前JVM到底可以缓存多少数据?
(1)单个Executor的Cache数据量计算公式: Heap Size * spark.storage.safetyFraction * spark.storage.memoryFraction
(2)单个Executor的角度来讲:Heap Size * 90% * 60% = HeapSize * 54%,如果Executor大小是10G的话,从理论上讲单个Executor可以缓存的数据大小是5.4G,关于缓存大小的控制参数由spark.stroage.safetyFraction和spark.stroage.memoryFraction共同决定。
(3)如果是100个Executors的话,每个的Heap是10G,那么理论上讲可以缓存540G的数据,普通规模的计算基本都可以满足。
Spark1.6.X以前ShuffleHeap占用大小计算??
(1)计算公式:Heap Size * spark.stroage.safetyFraction *spark.shuffle.memoryFraction * spark.shuffle.safetyFraction默认情况下是Heap Size * 14.4%。
(2)单个Executor的角度来讲:整个Heap大小(Heap Size) * spark.storage.safetyFraction(安全存储的大小默认90%) * Spark.shuffle.memoryFraction(20%)Spark.shuffle.safetyFraction(可用安全阈值80%)默认情况下是Heap size * 14.4%,如果Executor大小是10G的话,理论上讲单个Executor Shuffle可用大小为1.44G。
Unroll占用空间计算及对缓存数据影响是什么??
(1)计算公式:Heap Size * spark.stroage.safetyFraction * spark.stroage.memoryFraction* spark.storage.unrollFraction。默认情况下是:HeapSize *10.8%。
(2)对Cache数据影响:由于Unroll是一个优先级高的操作,进行Unroll操作的时候回占用Cache的空间,即可以挤掉缓存中的数据(如果该数据的级别是MemoryOnly的话,则该数据就会丢失)