Spark OFF_HEAP

OFF_HEAP

Spark中RDD提供了幾種存儲(chǔ)級(jí)別屿储,不同的存儲(chǔ)級(jí)別可以帶來(lái)不同的容錯(cuò)性能拣技,例如 MEMORY_ONLY,MEMORY_ONLY_SER_2...其中偏形,有一種特別的是OFF_HEAP
off_heap的優(yōu)勢(shì)在于敏储,在內(nèi)存有限的條件下谎柄,減少不必要的內(nèi)存消耗丁侄,以及頻繁的GC問(wèn)題,提升程序性能朝巫。
Spark2.0以前绒障,默認(rèn)的off_heap是Tachyon,當(dāng)然捍歪,你可以通過(guò)繼承ExternalBlockManager 來(lái)實(shí)現(xiàn)你自己想要的任何off_heap户辱。
這里說(shuō)Tachyon,是因?yàn)镾park默認(rèn)的TachyonBlockManager開(kāi)發(fā)完成之后糙臼,就再也沒(méi)有更新過(guò)庐镐,以至于Tachyon升級(jí)為Alluxio之后移除不使用的API,導(dǎo)致Spark默認(rèn)off_heap不可用变逃,這個(gè)問(wèn)題Spark社區(qū)和Alluxio社區(qū)都有反饋:ALLUXIO-1881

Spark2.0的off_heap

從spark2.0開(kāi)始必逆,社區(qū)已經(jīng)移除默認(rèn)的TachyonBlockManager以及ExternalBlockManager相關(guān)的API:SPARK-12667
那么,問(wèn)題來(lái)了名眉,在Spark2.0中粟矿,OFF_HEAP是怎么處理的呢?數(shù)據(jù)存在哪里损拢?
上代碼:
首先陌粹,在StorageLevel里面,不同的存儲(chǔ)級(jí)別解析成不同的構(gòu)造函數(shù)福压,從OFF_HEAP的構(gòu)造函數(shù)可以看出來(lái)掏秩,OFF_HEAP依舊存在。

Object StorageLevel {
val NONE = new StorageLevel(false, false, false, false)
val DISK_ONLY = new StorageLevel(true, false, false, false)
val DISK_ONLY_2 = new StorageLevel(true, false, false, false, 2)
val MEMORY_ONLY = new StorageLevel(false, true, false, true)
val MEMORY_ONLY_2 = new StorageLevel(false, true, false, true, 2)
val MEMORY_ONLY_SER = new StorageLevel(false, true, false, false)
val MEMORY_ONLY_SER_2 = new StorageLevel(false, true, false, false, 2)
val MEMORY_AND_DISK = new StorageLevel(true, true, false, true)
val MEMORY_AND_DISK_2 = new StorageLevel(true, true, false, true, 2)
val MEMORY_AND_DISK_SER = new StorageLevel(true, true, false, false)
val MEMORY_AND_DISK_SER_2 = new StorageLevel(true, true, false, false, 2)
val OFF_HEAP = new StorageLevel(false, false, true, false)
              ......  ........
}

在org.apache.spark.memory中荆姆,有一個(gè)MemoryMode蒙幻,MemoryMode標(biāo)記了使用ON_HEAP還是OFF_HEAP,在org.apache.spark.storage.memory.MemoryStore中,根據(jù)MemoryMode類(lèi)型來(lái)調(diào)用不同的存儲(chǔ)

def putBytes[T: ClassTag](    
  blockId: BlockId,    
  size: Long,    
  memoryMode: MemoryMode,
   _bytes: () => ChunkedByteBuffer): Boolean = {
      .............
      val entry = new SerializedMemoryEntry[T](bytes, memoryMode, implicitly[ClassTag[T]])
      entries.synchronized { 
         entries.put(blockId, entry)
      }
      .............
  }

再看MemoryStore中存數(shù)據(jù)的方法:putIteratorAsBytes

val allocator = memoryMode match {  
  case MemoryMode.ON_HEAP => ByteBuffer.allocate _ 
  case MemoryMode.OFF_HEAP => Platform.allocateDirectBuffer _
}

終于找到Spark2.0中off_heap的底層存儲(chǔ)了:Platform是利用java unsafe API實(shí)現(xiàn)的一個(gè)訪問(wèn)off_heap的類(lèi)胆筒。

總結(jié)

spark2.0 off_heap就是利用java unsafe API實(shí)現(xiàn)的內(nèi)存管理邮破。
優(yōu)點(diǎn):依然可以減少內(nèi)存的使用,減少頻繁的GC仆救,提高程序性能抒和。
缺點(diǎn):從代碼中看到,使用OFF_HEAP并沒(méi)有備份數(shù)據(jù)派桩,也不能像alluxio那樣保證數(shù)據(jù)高可用,丟失數(shù)據(jù)則需要重新計(jì)算蚌斩。

鏈接:http://www.reibang.com/p/c6f6d4071560

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末铆惑,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子送膳,更是在濱河造成了極大的恐慌员魏,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,332評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件叠聋,死亡現(xiàn)場(chǎng)離奇詭異撕阎,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)碌补,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,508評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)虏束,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人厦章,你說(shuō)我怎么就攤上這事镇匀。” “怎么了袜啃?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,812評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵汗侵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng)晰韵,這世上最難降的妖魔是什么发乔? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,607評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮雪猪,結(jié)果婚禮上栏尚,老公的妹妹穿的比我還像新娘。我一直安慰自己浪蹂,他們只是感情好抵栈,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,728評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著坤次,像睡著了一般古劲。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上缰猴,一...
    開(kāi)封第一講書(shū)人閱讀 49,919評(píng)論 1 290
  • 那天产艾,我揣著相機(jī)與錄音,去河邊找鬼滑绒。 笑死闷堡,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的疑故。 我是一名探鬼主播杠览,決...
    沈念sama閱讀 39,071評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼纵势!你這毒婦竟也來(lái)了踱阿?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,802評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤钦铁,失蹤者是張志新(化名)和其女友劉穎软舌,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體牛曹,經(jīng)...
    沈念sama閱讀 44,256評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡佛点,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,576評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了黎比。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片超营。...
    茶點(diǎn)故事閱讀 38,712評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖阅虫,靈堂內(nèi)的尸體忽然破棺而出糟描,到底是詐尸還是另有隱情,我是刑警寧澤书妻,帶...
    沈念sama閱讀 34,389評(píng)論 4 332
  • 正文 年R本政府宣布船响,位于F島的核電站躬拢,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏见间。R本人自食惡果不足惜聊闯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,032評(píng)論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望米诉。 院中可真熱鬧菱蔬,春花似錦、人聲如沸史侣。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)惊橱。三九已至蚪腐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間税朴,已是汗流浹背回季。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,026評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留正林,地道東北人泡一。 一個(gè)月前我還...
    沈念sama閱讀 46,473評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像觅廓,于是被迫代替她去往敵國(guó)和親鼻忠。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,606評(píng)論 2 350

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

  • 在文章的開(kāi)頭杈绸,安利一下我自己的github上的一個(gè)項(xiàng)目:AlluxioBlockManager帖蔓,同時(shí)還有我的git...
    AlbertCheng閱讀 3,997評(píng)論 -1 1
  • spark內(nèi)存使用大小管理 MemoryManager 的具體實(shí)現(xiàn)上,Spark 1.6 之后默認(rèn)為統(tǒng)一管理(Un...
    曾小俊愛(ài)睡覺(jué)閱讀 573評(píng)論 0 1
  • Spark 作為一個(gè)基于內(nèi)存的分布式計(jì)算引擎蝇棉,其內(nèi)存管理模塊在整個(gè)系統(tǒng)中扮演著非常重要的角色讨阻。理解 Spark 內(nèi)...
    尼小摩閱讀 601評(píng)論 1 5
  • 歡迎關(guān)注我的微信公眾號(hào):FunnyBigData 作為打著 “內(nèi)存計(jì)算” 旗號(hào)出道的 Spark芥永,內(nèi)存管理是其非常...
    牛肉圓粉不加蔥閱讀 4,169評(píng)論 2 24
  • 春天埋涧,故鄉(xiāng)的白色花兒又開(kāi)了板辽。已記不清這花兒幾度開(kāi)了再謝,謝了再開(kāi)棘催,只記得每次爬上山坡劲弦,鉆進(jìn)那白花花的世界采...
    琳兮Clover閱讀 286評(píng)論 0 0