spark中的內(nèi)存管理

概述

本編文章的內(nèi)容:

  1. 在executor端削祈,內(nèi)存的管理
  2. 在driver端尤莺,內(nèi)存的管理

1. executor內(nèi)存管理

1.1 堆內(nèi)存布局

## UnifiedMemoryManager
private def getMaxMemory(conf: SparkConf): Long = {
    val systemMemory = Runtime.getRuntime.maxMemory
    val reservedMemory = 300 * 1024 * 1024
    val usableMemory = systemMemory - reservedMemory
    val memoryFraction = conf.getDouble("spark.memory.fraction", 0.6)
    (usableMemory * memoryFraction).toLong
  }

如代碼所示曹铃,堆內(nèi)存被分為3塊妓局,一塊是預(yù)留內(nèi)存萌焰,一塊是額外使用內(nèi)存哺眯,一塊是spark用來管理的堆內(nèi)存,值如下:

  1. systemMemory的值為eden區(qū) + 一個(gè)surivior + old區(qū)
  2. 預(yù)留內(nèi)存reservedMemory為300M
  3. 默認(rèn)情況下扒俯,額外使用內(nèi)存為剩余內(nèi)存的40%
  4. 默認(rèn)情況下奶卓,通過UnifiedMemoryManager管理的內(nèi)存為剩余內(nèi)存的60%

里面也包含了一層含義,在整個(gè)executor的運(yùn)行周期中撼玄,executor所有組件使用的內(nèi)存通常不會(huì)超過300M夺姑,由于用戶在rdd的transform或action中使用的內(nèi)存不可預(yù)知,spark.memory.fraction應(yīng)該由用戶自己來控制掌猛,如果用戶在自己的程序中使用的內(nèi)存(如沒有使用Map盏浙、List等數(shù)據(jù)結(jié)構(gòu)來存儲(chǔ)數(shù)據(jù))較少,可以相應(yīng)的調(diào)大spark.memory.fraction的值,這對(duì)shuffle和cache都有好處废膘;當(dāng)然這也不是必須的竹海,Reduce spark.memory.fraction default to avoid overrunning old gen in JVM default config描述了一種情況:當(dāng)spark.memory.fraction設(shè)置過大時(shí),比如0.75殖卑,當(dāng)需要緩存大量數(shù)據(jù)到堆內(nèi)存中時(shí)站削,會(huì)導(dǎo)致長時(shí)間的full gc,原因如下:

  1. JVM的參數(shù)NewRatio默認(rèn)是2孵稽,說明老年代占用的堆大小的66%
  2. 在使用堆內(nèi)存緩存數(shù)據(jù)時(shí)许起,最大的內(nèi)存占比為spark.memory.fraction,即75%
  3. 此時(shí)數(shù)據(jù)不能完全放入到old區(qū)而導(dǎo)致full gc菩鲜,影響程序性能

1.2 內(nèi)存管理

Spark通過MemoryManager來管理內(nèi)存园细,它有兩個(gè)實(shí)現(xiàn)類:StaticMemoryManagerUnifiedMemoryManager接校,前者基本沒有用了猛频,后者有如下特點(diǎn):

  1. 內(nèi)存分為2部分,一部分為存儲(chǔ)內(nèi)存蛛勉,另一個(gè)部分為執(zhí)行內(nèi)存
  2. 默認(rèn)情況下鹿寻,存儲(chǔ)內(nèi)存占整個(gè)管理內(nèi)存的50%,由spark.memory.storageFraction決定诽凌,其余的為執(zhí)行內(nèi)存
  3. 存儲(chǔ)內(nèi)存執(zhí)行內(nèi)存在對(duì)方有空閑空間時(shí)毡熏,可以互借;但是侣诵,執(zhí)行內(nèi)存不會(huì)主動(dòng)釋放痢法,如果執(zhí)行內(nèi)存借了存儲(chǔ)內(nèi)存,此時(shí)存儲(chǔ)內(nèi)存不夠需要執(zhí)行內(nèi)存歸還,被借的內(nèi)存由于執(zhí)行內(nèi)存占用不會(huì)歸還杜顺。而當(dāng)執(zhí)行內(nèi)存不夠而存儲(chǔ)內(nèi)存借用的執(zhí)行內(nèi)存會(huì)被歸還

UnifiedMemoryManager除了使用上述的堆內(nèi)存外财搁,還可以使用堆外內(nèi)存,由spark.memory.offHeap.enabled開啟躬络,由spark.memory.offHeap.size確定堆外內(nèi)存的大小尖奔,堆外內(nèi)存也分為存儲(chǔ)內(nèi)存執(zhí)行內(nèi)存存儲(chǔ)內(nèi)存占比也是由spark.memory.storageFraction決定

spark_內(nèi)存分布概覽

1.3 執(zhí)行內(nèi)存的使用

spark_shuffle_使用執(zhí)行內(nèi)存概覽.PNG

如果需要使用MemoryManager管理的執(zhí)行內(nèi)存穷当,都需要繼承MemoryConsumer越锈,在學(xué)習(xí)代碼的過程中,發(fā)現(xiàn)堆內(nèi)存與堆外內(nèi)存并沒有混合使用膘滨,即堆外內(nèi)存與堆內(nèi)存不會(huì)互借(如果有甘凭,請(qǐng)讀者不吝指出),可能實(shí)現(xiàn)比較麻煩火邓,我總結(jié)了上圖的內(nèi)存使用場(chǎng)景丹弱。其實(shí)上圖也比較好理解德撬,因?yàn)?code>ExternalSorter、ExternalAppendOnlyMap里面的數(shù)據(jù)都是反序列化的躲胳,所以需要使用堆內(nèi)存蜓洪;而ShuffleExternalSorter的數(shù)據(jù)都是序列化的,可在堆內(nèi)也可在堆外坯苹,可能因?yàn)槿≈祵?shí)現(xiàn)起來麻煩所以堆外內(nèi)存與堆內(nèi)存不會(huì)互借隆檀。
每個(gè)任務(wù)能使用的最大執(zhí)行內(nèi)存為該executor執(zhí)行內(nèi)存 / 該executor正在執(zhí)行的任務(wù)數(shù),最小執(zhí)行內(nèi)存為該executor執(zhí)行內(nèi)存 / 2 * 該executor正在執(zhí)行的任務(wù)數(shù)粹湃,當(dāng)任務(wù)需要的內(nèi)存大于最小執(zhí)行內(nèi)存恐仑,但是實(shí)際能分配給它的內(nèi)存又小于最小執(zhí)行內(nèi)存時(shí),則會(huì)阻塞等待为鳄,直到其它的任務(wù)釋放完內(nèi)存后喚醒它裳仆。

1.4 存儲(chǔ)內(nèi)存的使用

spark_shuffle_使用存儲(chǔ)內(nèi)存概覽

在spark-core中,只有兩種情形會(huì)是使用存儲(chǔ)內(nèi)存孤钦,一種是RDD需要緩存歧斟,二是廣播變量,其消耗的內(nèi)存類別如上圖偏形。

1.5 未被MemoryManager管理的內(nèi)存使用

  1. 各個(gè)組件用來緩存的數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)静袖,如MapList俊扭;這是走JVM管理的
  2. 用戶在自己的代碼中使用的數(shù)據(jù)結(jié)構(gòu)
  3. NettyBlockTransferService向外傳輸數(shù)據(jù)和接收數(shù)據(jù)勾徽,當(dāng)數(shù)據(jù)小于spark.storage.memoryMapThreshold(默認(rèn)2MB),分配傳輸?shù)?code>ByteBuffer為HeapByteBuffer,會(huì)分配在堆上统扳;但是最終netty會(huì)使用堆外內(nèi)存(默認(rèn))將數(shù)據(jù)傳輸出去
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市畅姊,隨后出現(xiàn)的幾起案子咒钟,更是在濱河造成了極大的恐慌,老刑警劉巖若未,帶你破解...
    沈念sama閱讀 218,451評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件朱嘴,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡粗合,警方通過查閱死者的電腦和手機(jī)萍嬉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來隙疚,“玉大人壤追,你說我怎么就攤上這事」┨耄” “怎么了行冰?”我有些...
    開封第一講書人閱讀 164,782評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵溺蕉,是天一觀的道長。 經(jīng)常有香客問我悼做,道長疯特,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,709評(píng)論 1 294
  • 正文 為了忘掉前任肛走,我火速辦了婚禮漓雅,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘朽色。我一直安慰自己邻吞,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評(píng)論 6 392
  • 文/花漫 我一把揭開白布纵搁。 她就那樣靜靜地躺著吃衅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪腾誉。 梳的紋絲不亂的頭發(fā)上徘层,一...
    開封第一講書人閱讀 51,578評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音利职,去河邊找鬼趣效。 笑死,一個(gè)胖子當(dāng)著我的面吹牛猪贪,可吹牛的內(nèi)容都是我干的跷敬。 我是一名探鬼主播,決...
    沈念sama閱讀 40,320評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼热押,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼西傀!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起桶癣,我...
    開封第一講書人閱讀 39,241評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤拥褂,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后牙寞,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體饺鹃,經(jīng)...
    沈念sama閱讀 45,686評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評(píng)論 3 336
  • 正文 我和宋清朗相戀三年间雀,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了悔详。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,992評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡惹挟,死狀恐怖茄螃,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情连锯,我是刑警寧澤责蝠,帶...
    沈念sama閱讀 35,715評(píng)論 5 346
  • 正文 年R本政府宣布党巾,位于F島的核電站,受9級(jí)特大地震影響霜医,放射性物質(zhì)發(fā)生泄漏齿拂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評(píng)論 3 330
  • 文/蒙蒙 一肴敛、第九天 我趴在偏房一處隱蔽的房頂上張望署海。 院中可真熱鬧,春花似錦医男、人聲如沸砸狞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽刀森。三九已至,卻和暖如春报账,著一層夾襖步出監(jiān)牢的瞬間研底,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評(píng)論 1 270
  • 我被黑心中介騙來泰國打工透罢, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留榜晦,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,173評(píng)論 3 370
  • 正文 我出身青樓羽圃,卻偏偏與公主長得像乾胶,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子朽寞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容