轉自:https://github.com/jacksu/utils4s/blob/master/spark-knowledge/md/spark%E5%86%85%E5%AD%98%E6%A6%82%E8%BF%B0.md
1.5以前
spark進程是以JVM進程運行的,可以通過-Xmx和-Xms配置堆棧大小,它是如何使用堆棧呢?下面是spark內存分配圖。
storage memory
spark默認JVM堆為512MB,為了避免OOM錯誤,只使用90%。通過spark.storage.safetyFraction來設置。spark通過內存來存儲需要處理的數據,使用安全空間的60%,通過 spark.storage.memoryFraction來控制。如果我們想知道spark緩存數據可以使用多少空間?假設執行任務需要executors數為N,那么可使用空間為N*90%*60%*512MB,但實際緩存數據的空間還要減去unroll memory。
shuffle memory
shuffle memory的內存為“Heap Size” * spark.shuffle.safetyFraction * spark.shuffle.memoryFraction。默認spark.shuffle.safetyFraction 是 0.8 ,spark.shuffle.memoryFraction是0.2 ,因此shuffle memory為 0.8*0.2*512MB = 0.16*512MB,shuffle memory為shuffle用作數據的排序等。
unroll memory
unroll memory的內存為spark.storage.unrollFraction * spark.storage.memoryFraction * spark.storage.safetyFraction,即0.2 * 0.6 * 0.9 * 512MB = 0.108 * 512MB。unroll memory用作數據序列化和反序列化。
1.6開始
提出了一個新的內存管理模型: Unified Memory Management。打破ExecutionMemory 和 StorageMemory 這種分明的界限。如果現在沒有execution的需要,那么所有的內存都可以給storage用,反過來也是一樣的。同時execution可以evict storage的部分內存,但是反過來不行。在新的內存管理框架上使用兩個參數來控制spark.memory.fraction和spark.memory.storageFraction。