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