RDD緩存管理cacheManager
當需要計算RDD時,需要避免重複計算的RDD。
- 什麼時候RDD可能會被重複計算?一般是寬依賴RDD, 即RDD的下游可能有多個, 但是另一個下游的拉去可能較慢, 那麼此時需要做緩存。
cacheManager只是對RDD的管理, 真正的緩存以及獲取是通過blockManager,然後根據內存情況選擇存內存還是存磁盤。
- RDD不是一定會做緩存,這取決於存儲級別的設定。
- RDD沒緩存時, 不一定要重新計算, 也可能從CheckPoint中拿
- checkPoint概念:
checkpoint在spark中主要有兩塊應用:一塊是在spark core中對RDD做checkpoint,可以切斷做checkpoint RDD的依賴關係,將RDD數據保存到可靠存儲(如HDFS)以便數據恢復;另外一塊是應用在spark streaming中,使用checkpoint用來保存DStreamGraph以及相關配置信息,以便在Driver崩潰重啓的時候能夠接着之前進度繼續進行處理(如之前waiting batch的job會在重啓後繼續處理)。
如果需要存入內存,直接使用memoryStore即可,memoryStore的存儲過程見上一篇博文。
如果要寫入磁盤,需要調用diskStore提供的put方法把RDD對應的block塊寫入磁盤
diskStore和diskBlockManager有什麼關係?
diskStore裏要寫入數據時,負責打開某個文件, 然後往文件裏寫入。
取出數據時,也是找到對應的文件,然後取出數據。
而這個磁盤文件的管理並沒有放到diskStore裏實現,而是獨立了一個diskBlockManager模塊。
以DiskStore的putArray方法爲例,從下圖可看出關係:
即文件相關、序列化相關,都讓diskBlockManager來搞了。
diskBlockManager的getFile過程
上圖裏有個getFile的操作,即從DBM中拿到文件對象做寫入。
那麼這個文件創建時,怎麼選路徑,怎麼命名?
首先,文件的路徑和文件名, 使用2次哈希得到
使用2級哈希做路徑的目的,是因爲一級目錄有多個,需要用哈希選擇放到哪個一級目錄。
每次創建文件的話,會把該文件放到DBM裏的一個數組中,並加上鉤子做管理,如果程序中止或者結束,需要主動清理臨時文件。
DiskBlockManager全圖: