我們知道一個task在執(zhí)行一個RDD時讳嘱,會調用rdd的iterator()方法,計算當前的partition.
但是惹挟,如果之前從來沒有對這個RDD進行持久化熟妓,那么實際上是從RDD的父RDD來執(zhí)行我們的算子來計算新的RDD的partition數(shù)據(jù)。
如果這個RDD以前持久化過慈俯,那么就是說它的StoreLevel肯定不是NONE渤刃,那么此時CacheManager就會幫忙我們直接去找到持久化的數(shù)據(jù)
雖然我們持久化過,但如果因為一些原因肥卡,數(shù)據(jù)卻拿不到了溪掀,BlockManager首先從本地讀取數(shù)據(jù)事镣,如果本地沒有步鉴,則嘗試從遠程獲getRemote()方法
如果遠程也無法獲取數(shù)據(jù)揪胃,會嘗試讀取之前checkpoint過的數(shù)據(jù),如果連checkpoint的數(shù)據(jù)都沒有讀取到氛琢,那么就只能重新計算一份喊递,并把計算完的數(shù)據(jù)進行持久化
對數(shù)據(jù)持久化,當持久級別是硬盤時阳似,就直接用BlockManager.doPut()方法持久化
對數(shù)據(jù)持久級別是內存時骚勘,先保存數(shù)據(jù)到內存,如果內存不夠時撮奏,會調用自己的算法俏讹,把內存中的一部分數(shù)據(jù)持久化磁盤,整理出來一部分空間畜吊,然后在將數(shù)據(jù)寫入內存泽疆。