Spark内存管理(2)—— 统一内存管理
Spark內(nèi)存管理系列文章:?
Spark內(nèi)存管理(1)—— 靜態(tài)內(nèi)存管理
堆內(nèi)內(nèi)存
Spark 1.6之后引入的統(tǒng)一內(nèi)存管理機(jī)制,與靜態(tài)內(nèi)存管理的區(qū)別在于Storage和Execution共享同一塊內(nèi)存空間,可以動(dòng)態(tài)占用對(duì)方的空閑區(qū)域?
其中最重要的優(yōu)化在于動(dòng)態(tài)占用機(jī)制,其規(guī)則如下:
-
設(shè)定基本的Storage內(nèi)存和Execution內(nèi)存區(qū)域(spark.storage.storageFraction參數(shù)),該設(shè)定確定了雙方各自擁有的空間的范圍
-
雙方的空間都不足時(shí),則存儲(chǔ)到硬盤?
若己方空間不足而對(duì)方空余時(shí),可借用對(duì)方的空間(存儲(chǔ)空間不足是指不足以放下一個(gè)完整的 Block) -
Execution的空間被對(duì)方占用后,可讓對(duì)方將占用的部分轉(zhuǎn)存到硬盤,然后”歸還”借用的空間
-
Storage的空間被對(duì)方占用后,無法讓對(duì)方”歸還”,因?yàn)樾枰紤] Shuffle過程中的很多因素,實(shí)現(xiàn)起來較為復(fù)雜
動(dòng)態(tài)內(nèi)存占用機(jī)制
動(dòng)態(tài)占用機(jī)制如下圖所示:?
憑借統(tǒng)一內(nèi)存管理機(jī)制,Spark 在一定程度上提高了堆內(nèi)和堆外內(nèi)存資源的利用率,降低了開發(fā)者維護(hù) Spark 內(nèi)存的難度,但并不意味著開發(fā)者可以高枕無憂?
譬如:如果Storage的空間太大或者說緩存的數(shù)據(jù)過多,反而會(huì)導(dǎo)致頻繁的全量垃圾回收,降低任務(wù)執(zhí)行時(shí)的性能,因?yàn)榫彺娴?RDD 數(shù)據(jù)通常都是長(zhǎng)期駐留內(nèi)存的。所以要想充分發(fā)揮 Spark 的性能,需要開發(fā)者進(jìn)一步了解存儲(chǔ)內(nèi)存和執(zhí)行內(nèi)存各自的管理方式和實(shí)現(xiàn)原理
堆外內(nèi)存
如下圖所示,相較于靜態(tài)內(nèi)存管理,引入了動(dòng)態(tài)占用機(jī)制?
計(jì)算公式
spark從1.6版本以后,默認(rèn)的內(nèi)存管理方式就調(diào)整為統(tǒng)一內(nèi)存管理模式?
由UnifiedMemoryManager實(shí)現(xiàn)
Unified MemoryManagement模型,重點(diǎn)是打破運(yùn)行內(nèi)存和存儲(chǔ)內(nèi)存之間的界限,使spark在運(yùn)行時(shí),不同用途的內(nèi)存之間可以實(shí)現(xiàn)互相的拆借
Reserved Memory
這部分內(nèi)存是預(yù)留給系統(tǒng)使用,在1.6.1默認(rèn)為300MB,這一部分內(nèi)存不計(jì)算在Execution和Storage中;可通過spark.testing.reservedMemory進(jìn)行設(shè)置;然后把實(shí)際可用內(nèi)存減去這個(gè)reservedMemor得到usableMemory?
ExecutionMemory 和 StorageMemory 會(huì)共享usableMemory * spark.memory.fraction(默認(rèn)0.75)?
注意:
-
在Spark 1.6.1 中spark.memory.fraction默認(rèn)為0.75
-
在Spark 2.2.0 中spark.memory.fraction默認(rèn)為0.6
User Memory
分配Spark Memory剩余的內(nèi)存,用戶可以根據(jù)需要使用?
在Spark 1.6.1中,默認(rèn)占(Java Heap - Reserved Memory) * 0.25?
在Spark 2.2.0中,默認(rèn)占(Java Heap - Reserved Memory) * 0.4
Spark Memory
計(jì)算方式為:(Java Heap – ReservedMemory) * spark.memory.fraction?
在Spark 1.6.1中,默認(rèn)為(Java Heap - 300M) * 0.75?
在Spark 2.2.0中,默認(rèn)為(Java Heap - 300M) * 0.6?
Spark Memory又分為Storage Memory和Execution Memory兩部分?
兩個(gè)邊界由spark.memory.storageFraction設(shè)定,默認(rèn)為0.5
下一篇文章中,將帶來對(duì)Spark統(tǒng)一內(nèi)存管理設(shè)計(jì)理念的介紹
總結(jié)
以上是生活随笔為你收集整理的Spark内存管理(2)—— 统一内存管理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spark内存管理(1)—— 静态内存管
- 下一篇: Spark内存管理(3)—— 统一内存管