-
spark的一大特性就是基于記憶體計算,Driver只保存任務的宏觀性的元資料,資料量較小,且在執行程序中基本不變,不做重點分析,而真正的計算任務Task分布在各個Executor中,其中的記憶體資料量大,且會隨著計算的進行會發生實時變化,所以Executor的記憶體管理才分析的重點,
-
在執行Spark應用程式時,集群會啟動Driver和Executor兩種JVM行程,前者為主控行程,負責創建spark背景關系(context),提交spark作業(job),將作業轉化為計算任務(task),在各個Executor行程間協調任務的調度,后者負責在作業節點上執行具體任務,并將結果回傳給Driver,同時為需要持久化的RDD提供存盤功能,
-
作為一個JVM行程,Executor的記憶體管理時基于JVM記憶體管理機制的,spark對JVM-on-heap記憶體進行了更為詳細的規劃,以充分利用,同時spark還引入了off-heap記憶體,使之可以直接從運行節點的系統記憶體中開辟空間,進一步優化記憶體的使用,
堆記憶體的分配和回收完全依賴JVM的gc機制,應用不能靈活的操作記憶體,使用堆外記憶體則可以通過OS來分配和釋放,更為靈活
靜態記憶體管理:早期使用,on-heap分為四個區域,分別是Storage(20%)、Execution(60%)、Other(20%)、Ext,Storage用于快取持久化的RDD資料和廣播變數等,Execution用于快取shuffle程序中產生的中間資料,Other區用于存盤運行中的其他物件,Ext是一塊較小的預留空間,用以防止OOM的發生,起到兜底作用,幾個區塊間有嚴格的界限,不可逾越,off-heap分為兩個區,Storage(50%)、Execution(50%),也有嚴格界限,不可逾越,
統一記憶體管理:于Spark-1.6后引入,與靜態管理機制的不同在于初始Storage(50%)、Execution(50%),在執行程序中兩個區域可以根據自己和對方的內粗余量彈性的越界分配,更加靈活高效,off-heap也是兩個區域,沒有嚴格界限可以動態占用,
- 記憶體的動態占用:
0.存盤 < 50% && 執行 < 50%:互不占用
1.存盤 > 50% && 執行 > 50%:溢寫磁盤(前提是快取級別包含磁盤,若級別為純記憶體則丟棄資料)
2.存盤 > 50% && 執行 < 50%:存盤跨界借用,若一段時間后執行記憶體不足,則洗掉被借用記憶體,優先滿足執行的記憶體需要,
3.存盤 < 50% && 執行 > 50%:執行跨界借用,若一段時間后存盤記憶體不足,則不能被執行占用的存盤區記憶體,因為執行的優先級更高,要優先保證執行資料,
- 統一記憶體管理機制,有效的提高了堆記憶體和堆外記憶體的使用效率,降低了使用復雜度,但是并不能就此高枕無憂,由于RDD資料往往是長期生存的,如果存盤在記憶體中的資料過多,會引發頻繁的full-gc,降低了程式的吞吐量,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/29383.html
標籤:大數據
上一篇:Ambari HDP 下 SPARK2 與 Phoenix 整合
下一篇:Spark組件間通信
