乙個spark應用執行的過程如下所示:
executor上面執行的每個maptask結束後都會有mapstatus匯報給driver, 當maptask數量非常多的時候可能會導致driver出現oom,此時需要調整driver的記憶體大小,通過--conf spark.driver.memory=4g
或者--driver-memory 4g
來進行設定。
executor的記憶體由--conf spark.executor.memory=4g
或者--executor-memory 4g
設定。
上面介紹了spark中兩個角色(driver/executor),其中executor是實際執行task的節點,spark記憶體管理主要在executor上面。
如上圖所示, spark on yarn模式下乙個executor的記憶體使用情況:
整個executor是yarn的乙個container,所以它的總記憶體受yarn.scheduler.maximum-allocation-mb
的引數控制;
當使用者提交作業的時候通過spark.executor.memory
引數設定了executor的堆記憶體(heapsize),這部分記憶體的使用情況如上圖所示:
對於spark.executor.memroyoverhead
,它是executor可額外使用的堆外(off-heap)記憶體,比如spark的shuffle過程使用的netty就會使用到堆外記憶體,如果程式有遇到相關的oom錯誤,可以嘗試調大該引數。該記憶體不屬於上面spark.executor.memory
(on-heap),但是它們的總和不能超過yarn.scheduler.maximum-allocation-mb
.
上圖中execution/storage的記憶體((m-r)*spark.memroy.fraction
)是task在executor中執行需要用到的記憶體,它們通過unifiedmemorymanager
這個統一記憶體管理器來管理。
unifiedmemorymanager
中的execution和storage的管理沒有硬性的邊界控制(比如execution固定佔比多少),它們之間是乙個軟邊界,初始的邊界由spark.memory.storagefraction
來設定(預設0.5),但這個並不是乙個固定的邊界:
a)當execution不夠的時候,可以從storage側借記憶體,如storage基本沒使用(如沒有cache資料等),execution可以從storage借記憶體甚至全部都借完,即使後續有storage需要用記憶體也不能強制從execution拿回,除非execution後續自己釋放了部分記憶體,storage才能拿來使用;
b)當storage不夠的時候,如果execution有空閒多餘的記憶體,則也可以借,但是後續如果execution又需要更多記憶體了則可以強制從storage拿回記憶體(如可以將storge的資料寫到磁碟,然後釋放對應的記憶體),直到storage使用的記憶體減少到spark.memory.storagefraction
的比例。
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...