圖解spark RDD緩存管理cacheManager和磁盤管理DiskStore/DiskBlockManager

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全圖:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章