一,記憶體模型
Spark的記憶體模型如下圖所示:
- Reserved Memory 固定為 300MB,不受開發者控制,是啟動Spark架構本身所需要的記憶體空間
- UserMemory 是使用者空間,即使用者定義的資料,通常是使用者在代碼中定義的變量,可以說,除RDD、廣播、全局變量、計算過程中産生的資料之外都是使用者定義的資料
- Execution Memory 執行計算任務所需要的記憶體,如源資料加載占用的是這部分記憶體,以及在計算過程中産生的中間資料使用的記憶體都是這部分記憶體
- Storage Memory 緩存、廣播、全局變量使用這部分記憶體
PS:在記憶體不夠時,Spark是報OOM還是把部分資料溢出到檔案中?
在兩個場景下,會有溢出到檔案,一是RDD的cache,二是shuffle的中間資料。其他場景下,如果記憶體不足,會導緻OOM錯誤。
二,配置項
- spark.executor.memory 是絕對值,它指定了 Executor 程序的 JVM Heap 總大小。
- spark.memory.fraction 标記 Spark 處理分布式資料集的記憶體總大小,這部分記憶體包括 Execution Memory 和 Storage Memory 兩部分。如上圖所示,表示第一層記憶體占用的大小
- spark.memory.storageFraction 區分 Execution Memory 和 Storage Memory 的初始大小,辨別第一層劃分的兩部分各自占用的比例