99re热视频这里只精品,久久久天堂国产精品女人,国产av一区二区三区,久久久精品成人免费看片,99久久精品免费看国产一区二区三区

Spark RDD持久化

2018-11-26 16:29 更新

Spark RDD 持久化

Spark最重要的一個功能是它可以通過各種操作(operations)持久化(或者緩存)一個集合到內(nèi)存中。當你持久化一個RDD的時候,每一個節(jié)點都將參與計算的所有分區(qū)數(shù)據(jù)存儲到內(nèi)存中,并且這些數(shù)據(jù)可以被這個集合(以及這個集合衍生的其他集合)的動作(action)重復(fù)利用。這個能力使后續(xù)的動作速度更快(通???0倍以上)。對應(yīng)迭代算法和快速的交互使用來說,緩存是一個關(guān)鍵的工具。

你能通過persist()或者cache()方法持久化一個rdd。首先,在action中計算得到rdd;然后,將其保存在每個節(jié)點的內(nèi)存中。Spark的緩存是一個容錯的技術(shù)-如果RDD的任何一個分區(qū)丟失,它可以通過原有的轉(zhuǎn)換(transformations)操作自動的重復(fù)計算并且創(chuàng)建出這個分區(qū)。

此外,我們可以利用不同的存儲級別存儲每一個被持久化的RDD。例如,它允許我們持久化集合到磁盤上、將集合作為序列化的Java對象持久化到內(nèi)存中、在節(jié)點間復(fù)制集合或者存儲集合到Tachyon中。我們可以通過傳遞一個StorageLevel對象給persist()方法設(shè)置這些存儲級別。cache()方法使用了默認的存儲級別—StorageLevel.MEMORY_ONLY。完整的存儲級別介紹如下所示:

Storage LevelMeaning
MEMORY_ONLY將RDD作為非序列化的Java對象存儲在jvm中。如果RDD不適合存在內(nèi)存中,一些分區(qū)將不會被緩存,從而在每次需要這些分區(qū)時都需重新計算它們。這是系統(tǒng)默認的存儲級別。
MEMORY_AND_DISK將RDD作為非序列化的Java對象存儲在jvm中。如果RDD不適合存在內(nèi)存中,將這些不適合存在內(nèi)存中的分區(qū)存儲在磁盤中,每次需要時讀出它們。
MEMORY_ONLY_SER將RDD作為序列化的Java對象存儲(每個分區(qū)一個byte數(shù)組)。這種方式比非序列化方式更節(jié)省空間,特別是用到快速的序列化工具時,但是會更耗費cpu資源—密集的讀操作。
MEMORY_AND_DISK_SER和MEMORY_ONLY_SER類似,但不是在每次需要時重復(fù)計算這些不適合存儲到內(nèi)存中的分區(qū),而是將這些分區(qū)存儲到磁盤中。
DISK_ONLY僅僅將RDD分區(qū)存儲到磁盤中
MEMORY_ONLY_2, MEMORY_AND_DISK_2, etc.和上面的存儲級別類似,但是復(fù)制每個分區(qū)到集群的兩個節(jié)點上面
OFF_HEAP (experimental)以序列化的格式存儲RDD到Tachyon中。相對于MEMORY_ONLY_SER,OFF_HEAP減少了垃圾回收的花費,允許更小的執(zhí)行者共享內(nèi)存池。這使其在擁有大量內(nèi)存的環(huán)境下或者多并發(fā)應(yīng)用程序的環(huán)境中具有更強的吸引力。

NOTE:在python中,存儲的對象都是通過Pickle庫序列化了的,所以是否選擇序列化等級并不重要。

Spark也會自動持久化一些shuffle操作(如reduceByKey)中的中間數(shù)據(jù),即使用戶沒有調(diào)用persist方法。這樣的好處是避免了在shuffle出錯情況下,需要重復(fù)計算整個輸入。如果用戶計劃重用計算過程中產(chǎn)生的RDD,我們?nèi)匀煌扑]用戶調(diào)用persist方法。

如何選擇存儲級別

Spark的多個存儲級別意味著在內(nèi)存利用率和cpu利用效率間的不同權(quán)衡。我們推薦通過下面的過程選擇一個合適的存儲級別:

  • 如果你的RDD適合默認的存儲級別(MEMORY_ONLY),就選擇默認的存儲級別。因為這是cpu利用率最高的選項,會使RDD上的操作盡可能的快。

  • 如果不適合用默認的級別,選擇MEMORY_ONLY_SER。選擇一個更快的序列化庫提高對象的空間使用率,但是仍能夠相當快的訪問。

  • 除非函數(shù)計算RDD的花費較大或者它們需要過濾大量的數(shù)據(jù),不要將RDD存儲到磁盤上,否則,重復(fù)計算一個分區(qū)就會和重磁盤上讀取數(shù)據(jù)一樣慢。

  • 如果你希望更快的錯誤恢復(fù),可以利用重復(fù)(replicated)存儲級別。所有的存儲級別都可以通過重復(fù)計算丟失的數(shù)據(jù)來支持完整的容錯,但是重復(fù)的數(shù)據(jù)能夠使你在RDD上繼續(xù)運行任務(wù),而不需要重復(fù)計算丟失的數(shù)據(jù)。

  • 在擁有大量內(nèi)存的環(huán)境中或者多應(yīng)用程序的環(huán)境中,OFF_HEAP具有如下優(yōu)勢:

  • 它運行多個執(zhí)行者共享Tachyon中相同的內(nèi)存池
  • 它顯著地減少垃圾回收的花費
  • 如果單個的執(zhí)行者崩潰,緩存的數(shù)據(jù)不會丟失

刪除數(shù)據(jù)

Spark自動的監(jiān)控每個節(jié)點緩存的使用情況,利用最近最少使用原則刪除老舊的數(shù)據(jù)。如果你想手動的刪除RDD,可以使用RDD.unpersist()方法

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號