# rdd的持久化策略:
cache、persist、checkpoint三種策略(持久化的單位是partition)
1、cache是persist的乙個簡化版,
會將rdd中的資料持久化到記憶體中
cache = persists(storagelevel.memory_only) 不進行序列化
特點:
var rdd= rdd.cache.foreach x 錯誤的,這樣rdd 的結果就是遍歷後的
2、persist手動指定持久化級別
3、checkpoint
persist持久化級別:
1、預設情況下,效能最高的當然是
memory_only,但前提是你的記憶體必須足夠足夠大
可以綽綽有餘地存放下整個rdd的所有資料。因為不進行序列化與反序列化操作,就避免了這部分的效能開銷;對這個rdd的後續運算元操作,都是基於純記憶體中的資料的操作,不需要從磁碟檔案中讀取資料,效能也很高;而且不需要複製乙份資料副本,並遠端傳送到其他節點上。但是這裡必須要注意的是,在實際的生產環境中,恐怕能夠直接用這種策略的場景還是有限的,如果rdd中資料比較多時(比如幾十億),直接用這種持久化級別,會導致jvm的oom記憶體溢位異常。
2、如果使用memory_only級別時發生了記憶體溢位,那麼建議嘗試使用
memory_only_ser級別。(序列化後,降低了記憶體占用)
該級別會將rdd資料序列化後再儲存在記憶體中,此時每個partition僅僅是乙個位元組陣列而已,大大減少了物件數量,並降低了記憶體占用。這種級別比memory_only多出來的效能開銷,主要就是序列化與反序列化的開銷。但是後續運算元可以基於純記憶體進行操作,因此效能總體還是比較高的。此外,可能發生的問題同上,如果rdd中的資料量過多的話,還是可能會導致oom記憶體溢位的異常。
3、如果純記憶體的級別都無法使用,那麼建議使用
memory_and_disk_ser策略
而不是memory_and_disk策略。因為既然到了這一步,就說明rdd的資料量很大,記憶體無法完全放下。序列化後的資料比較少,可以節省記憶體和磁碟的空間開銷。同時該策略會優先盡量嘗試將資料快取在記憶體中,記憶體快取不下才會寫入磁碟。
4、通常不建議使用
disk_only和字尾為_2的級別
因為完全基於磁碟檔案進行資料的讀寫,會導致效能急劇降低,有時還不如重新計算一次所有rdd。字尾為_2的級別,必須將所有資料都複製乙份副本,併發送到其他節點上,資料複製以及網路傳輸會導致較大的效能開銷,除非是要求作業的高可用性,否則不建議使用。
spark效能調優 RDD持久化
第一,rdd重構與優化 盡量去復用rdd,差不多的rdd,可以抽取成為乙個共同的rdd,供後面的rdd計算時,反覆使用。第二,公共rdd一定要實現持久化 持久化,也就是說,將rdd中的資料快取到記憶體中,或者快取到磁碟中,blockmanager 以後無論對這個rdd做多少次計算,那麼都是直接取rd...
spark調優 shuffle調優
基於spark1.6 引數可以通過 new sparkcontext set 來設定,也可以通過命令的引數設定 conf spark.shuffle.file.buffer 預設值 32k 引數說明 該引數用於設定shuffle write task的bufferedoutputstream的buf...
spark調優 shuffle調優
每乙個shuffle的前半部分stage的task,每個task都會建立下乙個stage的task數量相同的檔案,比如下乙個stage會有100個task,那麼當前stage每個task都會建立100份檔案,會將同乙個key對應的values,一定是寫入同乙個檔案中的,也一定會將同乙個key對應的v...