Spark記憶體管理詳解

2021-09-25 13:16:52 字數 802 閱讀 8988

spark執行應用程式時,spark集群會啟動driver和executor兩種jvm程序,driver負責建立sparkcontext上下文,提交任務,task的分發等。executor負責task的計算任務,並將結果返回給driver。同時需要為需要持久化的rdd提供儲存。driver端的記憶體管理比較簡單,這裡所說的spark記憶體管理針對executor端的記憶體管理。

spark記憶體管理分為靜態記憶體管理和統一記憶體管理,spark1.6之前使用的是靜態記憶體管理,spark1.6之後引入了統一記憶體管理。

靜態記憶體管理中儲存記憶體、執行記憶體和其他記憶體的大小在 spark 應用程式執行期間均為固定的,但使用者可以應用程式啟動前進行配置。

統一記憶體管理與靜態記憶體管理的區別在於儲存記憶體和執行記憶體共享同一塊空間,可以互相借用對方的空間。

spark1.6以上版本預設使用的是統一記憶體管理,可以通過引數spark.memory.uselegacymode 設定為true(預設為false)使用靜態記憶體管理。

靜態記憶體管理分布圖

統一記憶體管理分布圖

reduce 中oom如何處理?

減少每次拉取的資料量

提高shuffle聚合的記憶體比例

提高excutor的總記憶體

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...