千鋒扣丁學(xué)堂大數(shù)據(jù)培訓(xùn)計算框架Spark之內(nèi)存模型
2019-06-27 14:40:13
3318瀏覽
今天千鋒扣丁學(xué)堂大數(shù)據(jù)培訓(xùn)老師給大家分享一篇關(guān)于大數(shù)據(jù)計算框架Spark之內(nèi)存模型的詳細介紹,首先Executor端的內(nèi)存模型,包括堆內(nèi)內(nèi)存(On-heapMemory)和堆外內(nèi)存(Off-heapMemory),下面我們一起來看一下吧。
存管理接口(MemoryManager)
Spark為Execution內(nèi)存和Storage內(nèi)存的管理提供了統(tǒng)一的接:MemoryManager。
MemoryManager的具體實現(xiàn)上,Spark1.6之后默認(rèn)為統(tǒng)一管理(UnifiedMemoryManager)方式,1.6之前采用的靜態(tài)管理(StaticMemoryManager)方式仍被保留,可通過配置spark.memory.useLegacyMode參數(shù)啟用。
1靜態(tài)內(nèi)存管理(StaticMemoryManager)
堆內(nèi)空間管理
存儲內(nèi)存、執(zhí)行內(nèi)存和其他內(nèi)存的大小在Spark應(yīng)用程序運行期間均為固定的,但可以在應(yīng)用程序啟動前進行配置。
可用的Execution內(nèi)存和可用的Storage內(nèi)存計算公式:
可用的Execution內(nèi)存=systemMaxMemory*spark.shuffle.memoryFraction*spark.shuffle.safetyFraction
可用的Storage內(nèi)存=systemMaxMemory*spark.storage.memoryFraction*spark.storage.safetyFraction
systemMaxMemory取決于當(dāng)前JVM堆內(nèi)內(nèi)存的大小,公式中的兩個safetyFraction參數(shù),其意義在于在邏輯上預(yù)留出一塊保險區(qū)域,降低因?qū)嶋H內(nèi)存超出當(dāng)前預(yù)設(shè)范圍而導(dǎo)致OOM的風(fēng)險。這塊邏輯上預(yù)留的區(qū)域同樣由JVM管理。
圖靜態(tài)內(nèi)存管理-堆內(nèi)內(nèi)存的分配
堆外空間管理
堆外只有Execution內(nèi)存和Storage內(nèi)存,他們的大小由spark.memory.storageFraction這個參數(shù)決定。由于堆外內(nèi)存占用的空間可以被精確計算,所以無需再設(shè)定保險區(qū)域
靜態(tài)內(nèi)存管理-堆外內(nèi)存的分配
2統(tǒng)一內(nèi)存管理
Spark1.6之后引入的統(tǒng)一內(nèi)存管理機制,與靜態(tài)內(nèi)存管理的區(qū)別在于Storage內(nèi)存和Execution內(nèi)存共享同一塊空間,可以動態(tài)占用對方的空閑區(qū)域。
堆內(nèi)內(nèi)存(On-heapMemory)
堆內(nèi)內(nèi)存區(qū)域大致可以分為以下四類:
1)Execution內(nèi)存:主要用于存放Shuffle、Join、Sort、Aggregation等計算過程中的臨時數(shù)據(jù)
2)Storage內(nèi)存:主要用于緩存和傳播內(nèi)部數(shù)據(jù)
3)Other:用戶數(shù)據(jù)結(jié)構(gòu)、Spark內(nèi)部元數(shù)據(jù)。
4)預(yù)留內(nèi)存(ReservedMemory):系統(tǒng)預(yù)留內(nèi)存。默認(rèn)是300MB。
堆內(nèi)存(Off-heapMemory)
Spark1.6開始引入了Off-heapmemory(詳見SPARK-11389)。這種模式不在JVM內(nèi)申請內(nèi)存,而是調(diào)用JavaunsafeAPI(如C語言里面的malloc())直接向操作系統(tǒng)申請內(nèi)存,JVM不管理這部分內(nèi)存,所以可以避免頻繁的GC,但要自己編寫內(nèi)存申請和釋放的邏輯。
堆外內(nèi)存分為兩類:Execution內(nèi)存和Storage內(nèi)存。
默認(rèn)情況下堆外內(nèi)存不啟用,可以通過配置spark.memory.offHeap.enabled參數(shù)啟用,通過配置spark.memory.offHeap.size參數(shù)設(shè)定堆外內(nèi)存空間的大小。
如果堆外內(nèi)存被啟用,那么Executor內(nèi)將同時存在堆內(nèi)和堆外內(nèi)存,Executor中的Execution內(nèi)存是堆內(nèi)的Execution內(nèi)存和堆外的Execution內(nèi)存之和,同理,Storage內(nèi)存也一樣。
說明
maxOffHeapMemory=spark.memory.offHeap.size
Execution內(nèi)存和Storage內(nèi)存動態(tài)調(diào)整
1)設(shè)定基本的Storage內(nèi)存和Execution內(nèi)存區(qū)域(通過spark.storage.storageFraction配置比例,默認(rèn)是0.5,即各占一半)
2)Storage內(nèi)存和Execution內(nèi)存都不足時,則存儲到硬盤;若己方空間不足而對方空余時,可借用對方的空間;(存儲空間不足是指不足以放下一個完整的Block)
3)Execution內(nèi)存空間被對方占用后,可讓對方將占用的部分轉(zhuǎn)存到硬盤,然后"歸還"借用的空間
4)Storage內(nèi)存空間被對方占用后,無法讓對方"歸還",因為實現(xiàn)起來較為復(fù)雜。
以上就是關(guān)于千鋒扣丁學(xué)堂大數(shù)據(jù)培訓(xùn)計算框架Spark之內(nèi)存模型的全部內(nèi)容,
想要了解更多關(guān)于大數(shù)據(jù)開發(fā)方面內(nèi)容的小伙伴,請關(guān)注扣丁學(xué)堂大數(shù)據(jù)培訓(xùn)官網(wǎng)、微信等平臺,扣丁學(xué)堂IT職業(yè)在線學(xué)習(xí)教育有專業(yè)的大數(shù)據(jù)講師為您指導(dǎo),此外扣丁學(xué)堂老師精心推出的大數(shù)據(jù)視頻教程定能讓你快速掌握大數(shù)據(jù)從入門到精通開發(fā)實戰(zhàn)技能??鄱W(xué)堂大數(shù)據(jù)學(xué)習(xí)群:209080834。
【關(guān)注微信公眾號獲取更多學(xué)習(xí)資料】 【掃碼進入Python全棧開發(fā)免費公開課】
查看更多關(guān)于“大數(shù)據(jù)培訓(xùn)資訊”的相關(guān)文章>
標(biāo)簽:
大數(shù)據(jù)培訓(xùn)
大數(shù)據(jù)視頻教程
大數(shù)據(jù)分析培訓(xùn)
大數(shù)據(jù)學(xué)習(xí)視頻
Hadoop生態(tài)圈
數(shù)據(jù)結(jié)構(gòu)
算法