Spark 記憶體管理概述

2021-07-30 14:15:43 字數 2831 閱讀 2892

spark被稱作記憶體計算引擎,使得很多初學者認為spark執行環境一定需要大量記憶體,更有甚者,認為spark執行期會把原始資料一次性全部載入到記憶體。解開這些疑團,需要了解spark執行時的機制,spark的計算發生在executor,因此,這裡的執行時機制是指executor的行為。

對於spark執行時機制,先從記憶體管理入手,了解這部分,對於spark調優也大有裨益,spark開發中很常見的問題是oom和full gc pause導致的假死現象,特別是在spark1.6之前的版本中,很可能會因為不熟悉記憶體管理導致大量記憶體執行時被閒置而浪費,這個問題在1.6中引入了新的記憶體管理器unifiedmemorymanager而得到優化。

記憶體管理對應的介面為memorymanager,但executor使用taskmemorymanagermemorystore間接呼叫memorymanager管理記憶體,涉及到的相關概念如下

概念作用

memorymanager

管理coarsegrainedexecutorbackend程序的記憶體(即executor),其將記憶體主要劃分為storage、execution和other三部分。coarsegrainedexecutorbackend上執行的task共享這部分記憶體

taskmemorymanager

內部使用memorymanager,管理所有task的execution這部分記憶體

memorystore

主要作用為管理記憶體中的block,即管理storage這部分記憶體

memorypool

用於記錄storage、execution記憶體的使用情況,對應子類分別為storagememorypool、executionmemorypool

staticmemorymanager

spark 1.6之前的記憶體管理器,靜態記憶體管理器,這裡的靜態是指storage、execution記憶體的佔比及界限是固定的。

unifiedmemorymanager

spark 1.6新加入的記憶體管理器,統一資源管理器,和staticmemorymanager最大不同之處在於,storage、execution記憶體界限不是固定的,可以互相借用

memorymanager負責管理記憶體,檢視其定義

從上圖中可以到記憶體有on-heap、off-heap之分,後續介紹,其uml如下

從上圖可以得到如下資訊

memorymanager的方法主要功能是管理記憶體,acquire*和release*。

從方法名判斷,memorymanager將記憶體分為了storage、execution、unroll三部分管理,下面會進一步介紹。

有三個配置是和tungsten相關,tungsten是spark執行引擎有史以來最大的改動,以榨幹效能為己任。具體是關於on_heapoff_heap的,如下

根據上面對memorymanager分析,memorymanager將記憶體分為如下幾部分

各部分對應的功能如下

名稱作用

storage

用於cache block,儲存broadcast資料,以及傳送large task result

unroll

unroll占用的是storage的記憶體,unroll是指 blockmanager收到iterator形式的資料,最終存放到記憶體的過程

execution

儲存shuffles、 joins、sorts 、aggregations等操作的中間資料

other

剩餘的部分,用於class以及spark中的元資料等開銷

上面各部分所佔比例由記憶體管理器實現類staticmemorymanagerunifiedmemorymanager確定。

execution的記憶體有兩種管理方式on-heap、off-heap,如下

名稱作用

on-heap

使用jvm管理物件

off-heap[tungsten memory相關優化]

手動管理,減小jvm物件空間及gc開銷

off-heap使用sun.misc.unsafe api直接向os申請釋放記憶體,具體實現及意義會在tungsten相關部分介紹,啟用方式如下

spark 記憶體管理之staticmemorymanager

spark 記憶體管理之unifiedmemorymanager

spark 記憶體管理之tungsten

參考:unified memory management in spark 1.6

memtune: dynamic memory management for

in-memory data analytic platforms

spark記憶體概述

spark程序是以jvm程序執行的,可以通過 xmx和 xms配置堆疊大小,它是如何使用堆疊呢?下面是spark記憶體分配圖。spark預設jvm堆為512mb,為了避免oom錯誤,只使用90 通過spark.storage.safetyfraction來設定。spark通過記憶體來儲存需要處理的資...

Spark記憶體管理

spark記憶體用途 rdd儲存 當呼叫rdd 的persist 或cache 方法時,這個rdd 的分割槽會被儲存到快取區中。spark 會根據spark.storage.memoryfraction 限制用來快取的記憶體佔整個jvm 堆空間的 比例大小。如果超出限制,舊的分割槽資料會被移出記憶體...

Spark記憶體管理

spark的一大特性就是基於記憶體計算,driver只儲存任務的巨集觀性的元資料,資料量較小,且在執行過程中基本不變,不做重點分析,而真正的計算任務task分布在各個executor中,其中的記憶體資料量大,且會隨著計算的進行會發生實時變化,所以executor的記憶體管理才分析的重點。在執行spa...