我們知道一個task在執行一個RDD時,會調用rdd的iterator()方法,計算當前的partition.
但是,如果之前從來沒有對這個RDD進行持久化,那么實際上是從RDD的父RDD來執行我們的算子來計算新的RDD的partition數據。
如果這個RDD以前持久化過,那么就是說它的StoreLevel肯定不是NONE,那么此時CacheManager就會幫忙我們直接去找到持久化的數據
雖然我們持久化過,但如果因為一些原因,數據卻拿不到了,BlockManager首先從本地讀取數據,如果本地沒有,則嘗試從遠程獲getRemote()方法
如果遠程也無法獲取數據,會嘗試讀取之前checkpoint過的數據,如果連checkpoint的數據都沒有讀取到,那么就只能重新計算一份,并把計算完的數據進行持久化
對數據持久化,當持久級別是硬盤時,就直接用BlockManager.doPut()方法持久化
對數據持久級別是內存時,先保存數據到內存,如果內存不夠時,會調用自己的算法,把內存中的一部分數據持久化磁盤,整理出來一部分空間,然后在將數據寫入內存。