您好,登錄后才能下訂單哦!
本篇文章為大家展示了如何實現Spark Executor內存管理,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
Spark 的內存管理是內存分布式引擎中的一個重要角色,了解內存管理機制和原理,才能更好地做優化。
靜態內存管理圖示——堆內
Unroll 的源碼參考:https://github.com/apache/spark/blob/branch-1.6/core/src/main/scala/org/apache/spark/storage/MemoryStore.scala#L249
靜態內存管理圖示——堆外
統一內存管理圖示——堆內
統一內存管理圖示——堆外
其中最重要的優化在于動態占用機制,其規則如下: 1\設定基本的存儲內存和執行內存區域(spark.storage.storageFraction 參數),該設定確定了雙方各自擁有的空間的范圍 雙方的空間都不足時,則存儲到硬盤;若己方空間不足而對方空余時,可借用對方的空間;(存儲空間不足是指不足以放下一個完整的 Block) 2\執行內存的空間被對方占用后,可讓對方將占用的部分轉存到硬盤,然后"歸還"借用的空間 3\存儲內存的空間被對方占用后,無法讓對方"歸還",因為需要考慮 Shuffle 過程中的很多因素,實現起來較為復雜
動態占用機制圖示
憑借統一內存管理機制,Spark 在一定程度上提高了堆內和堆外內存資源的利用率,降低了開發者維護 Spark 內存的難度,但并不意味著開發者可以高枕無憂。譬如,所以如果存儲內存的 空間太大 或者說 緩存的數據 過多,反而會導致頻繁的全量垃圾回收,降低任務執行時的性能,因為緩存的 RDD 數據通常都是長期駐留內存的。所以要想充分發揮 Spark 的性能,需要開發者進一步了解存儲內存和執行內存各自的管理方式和實現原理。
統一內存管理還可以簡化
(1)Reserved Memory
不推薦改變此參數(默認即可);
系統保留的內存,從Spark 1.6.0開始,它的值為300MB,如果沒有Spark重新編譯或設置 spark.testing.reservedMemory,它的大小不能以任何方式改變,,因為它不是用于生產的測試參數。
如果沒有給Spark執行程序至少 1.5 保留內存 = 450MB heap,spark-submit 將失敗并顯示**“please use larger heap size”*** 的錯誤消息。
(2)User Memory
在分配 Spark Memory之后剩余的內存池;
用戶可以在那里存儲將在RDD轉換中使用的數據結構、Spark的元數據,所以必須在編碼中注意數據結構的定義和使用;
內存池的大小可以計算為(“ Java heap ” - “reserved memory ”)(1.0 - spark.memory.fraction),默認情況下等于(“ Java堆 ” - 300MB ) 0.25
(3)Spark Memory
Apache Spark管理的內存池;
計算:(“ Java堆 ” - “保留內存 ”)* spark.memory.fraction,并且使用Spark 1.6.0默認值它給我們(“ Java堆 ” - 300MB)* 0.75。
Execution Memory 和 Storage Memory 的邊界由 spark.memory.storageFraction 設置 參數,默認為0.5。
Storage Memory:這個內存用于緩存以后還會用到的數據:如廣播變量 、persist
Execution Memory:這個內存用于存儲執行Spark shuffles、joins、sorts和aggregations 期間所需的對象。
上述內容就是如何實現Spark Executor內存管理,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。