1. 程式人生 > >Spark入門——4: Spark的儲存管理模組

Spark入門——4: Spark的儲存管理模組

        我們在運用Spark的時候,基本都是在於RDD打交道,實際上處理資料都是通過RDD提供的介面來操作。然而我們底層的資料到底是如何管理的呢?這正是今天我要學習的內容。

    RDD是有不同分割槽組成,我們的操作都是基於不同的分割槽來完成,而在儲存管理角度來講,RDD是以資料塊為單位的。本質上其實是等價的。

       儲存模組中的資料塊形式有:RDD資料塊; shuffle資料塊;廣播變數資料塊;任務返回結果資料塊(結果一般都是隨任務通過akka一起返回Driver,但是結果資料太大就會導致將結果先以Block的形式存放在儲存模組中)。

       1,儲存模組框架:

    架構上講,分為通訊層和儲存層。

        1)通訊層面採用主從方式實現通訊(主從節點間互換訊息);

        2)儲存層負責提供介面來儲存資料(可把資料儲存到記憶體,磁碟,或者遠端);

        儲存模組的兩大功能:

       1)實現RDD形式的快取(基於記憶體/磁碟);

        2)實現shuffle資料持久化;

    2,儲存模組與外界通訊的介面:

        BlockManager類。

        1)BlockManager類通過BlockManagerMaster進行通訊;

        2)主節點的BlockManager會包含所有從節點的BlockManager資訊;

        3)主從節點之間通過各自的BlockManagerMasterActor來進行相互通訊;

    3,通訊層的訊息傳遞:

 由上述可知,主從節點之間傳遞訊息用BlockManagerMasterActor,那麼所傳遞的訊息有哪些呢?

通過讀原始碼可知都有如下種類訊息:

        RegisterBlockManager(是Excutor建立BlockManager後,再向Driver傳送請求進行註冊);

        UpdateBlockInfo(用來更新資料塊中的元資訊,每個Excutor的BlockManager只會管理其自身Excutor下的元資訊);

        GetPeers(用來得到其他BlockManager的ID--------------->獲取他人BlockManager的ID。既然是獲取他人資訊,我們回想一下,誰擁有其他所有             人的資訊呢?當然是Driver上的BlockManager了,所以GetPeer的完成是通過Excutor向Driver傳送訊息來完成的);

        GetLocations(用來獲得資料塊自身所在的BlockManager對應的ID--------------->獲取自己BlockManager的ID);

        GetLocationsMultipleBlockIDs(用來獲取一組資料所在的BlockManager對應的ID--------------->獲取一組BlockManager的ID)

        RemoveExcutor(雖然名字是“刪除Excutor”,實際上是刪除死亡的Excutor下面的BlockManager)

        BlockManagerSlaveActor間互相通訊函式如下

        RemoveRdd

        RemoveBlock

       下面我們再來詳細過一下RDD分割槽和資料塊的關係:

       前面說到,RDD是基於分割槽來計算的,而在儲存管理中,儲存是以block為單位的。實際上是RDD這個邏輯概念是和Block物理儲存概念是一一對應的。他兩是通過對映關係聯絡到一起的。

      具體對映關係:block名=“rddID+分割槽索引號”。

      四,rdd快取機制

1,RDD預設以基於記憶體快取的方式將RDD快取。

           當資料超過快取閾值時:Spark會丟棄一部分記憶體中的資料或者將一部分資料從記憶體移出到磁碟中,具體情況依據RDD的持久化選項。

            如果是直接丟棄資料的話,程式會否報錯呢?

            答案是不一定的。如果被刪除的資料的祖先是可被回溯到的,那麼可以通過重新計算得到丟失的資料;

相反,程式會報錯哦。

    2,磁碟快取。

          磁碟快取機制:

          MEMORY_ONLY

          MEMORY_AND_DISK

          MEMORY_ONLY_SER

          MEMORY_AND_DISK_SER

          DISK_ONLY

          MEMORY_ONLY_2

          MEMORY_AND_DISK_2

          我們可以通過配置spark.local.dir來配置磁碟快取目錄

          儲存過程中,首選MEMORY_ONLY;其次選MEMORY_ONLY_SER;

          如果資料量大且重新計算的開銷大,那就用MEMORY_AND_DISK;

          如果要確保快速的恢復機制,那就選MEMORY_ONLY_2,MEMORY_AND_DISK_2(因為有備份)

        5,Shuffle資料的持久化:

      shuffle資料必須是在磁碟上進行快取,不能選擇在記憶體中快取;

          RDD在磁碟持久化中,一個block對應一個檔案,而shuffle資料塊只是邏輯上的概念,儲存方式因實現方式不同而不同

          (1)預設將shuffle資料塊對映成檔案

          (2)另外一種方式是將shuffle資料塊對映成檔案中的一段(實現方式是將spark.shuffle.consolidateFile設定為TRUE)

              6,廣播變數的儲存:

廣播變數存在的意義:實現資料在每個節點上都有一份拷貝;

         Broadcast資料塊是以MEMORY_AND_DISK的持久化方式儲存的;

         設定過期清理機制可以清理過期的廣播變數

     儲存管理模組承擔著資料管理,資料間通訊,持久化等工作,儲存管理模組的好壞對spark效能的影響至關重要!