W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
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 Level | Meaning |
---|---|
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)勢:
Spark自動的監(jiān)控每個節(jié)點緩存的使用情況,利用最近最少使用原則刪除老舊的數(shù)據(jù)。如果你想手動的刪除RDD,可以使用RDD.unpersist()
方法
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: