從1.6.0版本開始,spark記憶體管理模型發生了變化。舊的記憶體管理模型由staticmemorymanager
類實現,現在稱為「legacy(遺留)」。預設情況下,「legacy」模式被禁用,這意味著在spark 1.5.x和1.6.0上執行相同的**會導致不同的行為。為了相容,您可以使用spark.memory.uselegacymode
引數啟用「舊」記憶體模型。
1.6.0及以後版本,使用的統一記憶體管理器,由unifiedmemorymanager
實現,先看一張圖。
圖中主要有3個區域,分別用3種不同顏色表示。
系統保留記憶體。從spark 1.6.0起,它的值預設為300mb(被硬編碼到spark**中,**private val reserved_system_memory_bytes = 300 * 1024 * 1024)
),這意味著這個300mb的ram不參與spark記憶體區域大小的計算。它的值可以通過引數spark.testing.reservedmemory
來調整,但不推薦使用,從引數名字可以看到這個引數僅供測試使用,不建議在生產環境中使用。雖然是保留記憶體,但並不意味這這部分記憶體沒有使用,實際上,它會儲存大量的spark內部物件。而且,executor在執行時,必須保證至少有1.5 *保留記憶體= 450mb大小的堆,否則程式將失敗,並丟擲乙個異常「please use a larger heap size」。參考**:
val minsystemmemory = reservedmemory * 1.5
if (systemmemory < minsystemmemory)
這是由spark管理的記憶體池。它的大小可以計算為(「executor-memory」 - 「保留記憶體」)* spark.memory.fraction,並使用spark 1.6.0預設值給我們(「executor-memory」 - 300mb)* 0.75。例如,使用4gb executor-memory,這個池的大小將是2847mb。
這個整個池分為2個區域 -storage memory(儲存記憶體) 和execution memory(執行記憶體) ,它們之間的邊界由spark.memory.storagefraction引數設定,預設為0.5。
unifiedmemorymanager記憶體管理方案的優點是,該邊界不是靜態的。在某部分記憶體有壓力的情況下,邊界將被移動,即乙個區域將通過從另乙個借用空間而增長。稍後會討論「移動」這個邊界,現在讓我們來關注這個記憶體如何被使用。
這一塊記憶體用作spark快取資料(cache,persist)和序列化資料」unroll」臨時空間。另外所有的」broadcast」廣播變數都以快取塊存在這裡。其實並不需要記憶體中有足夠的空間來存unrolled塊- 如果沒有足夠的記憶體放下所有的unrolled分割槽,如果設定的持久化level允許的話,spark將會把它直接放進磁碟。所有的broadcast變數預設用memory_and_disk持久化level快取。
這一塊記憶體是用來儲存spark task執行需要的物件。比如用來儲存map階段的shuffle臨時buffer,此外還用來儲存hash合併用到的hash table。當沒有足夠可用記憶體時,這塊記憶體同樣可以溢寫到磁碟,但是這塊記憶體不能被其他執行緒(tasks)強行剝奪(該記憶體相對於storage memory更重要。storage memory記憶體如果被剝奪,可以通過重算來獲得資料。而 execution memory一旦剝奪,可能會引起程式失敗)。
Spark記憶體管理
spark記憶體用途 rdd儲存 當呼叫rdd 的persist 或cache 方法時,這個rdd 的分割槽會被儲存到快取區中。spark 會根據spark.storage.memoryfraction 限制用來快取的記憶體佔整個jvm 堆空間的 比例大小。如果超出限制,舊的分割槽資料會被移出記憶體...
Spark記憶體管理
spark的一大特性就是基於記憶體計算,driver只儲存任務的巨集觀性的元資料,資料量較小,且在執行過程中基本不變,不做重點分析,而真正的計算任務task分布在各個executor中,其中的記憶體資料量大,且會隨著計算的進行會發生實時變化,所以executor的記憶體管理才分析的重點。在執行spa...
Spark記憶體管理
spark記憶體管理不是通過物理或者硬體底層api實現對記憶體資源探測,只是通過對記憶體操作過程期間的位元組量的變化不斷更新維護的數字,通過該方式跟蹤記憶體使用情況。spark對每個task都關聯了記憶體的使用量,存放在了map中。嚴格意義上講,spark記憶體的管理是估算量,不是精確量。spark...