spark內核解析2-核心組件

Spark核心組件

Driver

Spark驅動器節點,用於執行Spark任務中的main方法,負責實際代碼的執行工作。Driver在Spark作業執行時主要負責:

  1. 將用戶程序轉化爲作業(job);
  2. 在Executor之間調度任務(task);
  3. 跟蹤Executor的執行情況;
  4. 通過UI展示查詢運行情況;

Executor

Spark Executor節點是一個JVM進程,負責在 Spark 作業中運行具體任務,任務彼此之間相互獨立。Spark 應用啓動時,Executor節點被同時啓動,並且始終伴隨着整個 Spark 應用的生命週期而存在。如果有Executor節點發生了故障或崩潰,Spark 應用也可以繼續執行,會將出錯節點上的任務調度到其他Executor節點上繼續運行。
Executor有兩個核心功能:

  1. 負責運行組成Spark應用的任務,並將結果返回給驅動器進程;
  2. 它們通過自身的塊管理器(Block Manager)爲用戶程序中要求緩存的 RDD 提供內存式存儲。RDD 是直接緩存在Executor進程內的,因此任務可以在運行時充分利用緩存數據加速運算。

task

輸入可能以多個文件的形式存儲在HDFS上,每個File都包含了很多塊,稱爲Block。當Spark讀取這些文件作爲輸入時,會根據具體數據格式對應的InputFormat進行解析,一般是將若干個Block合併成一個輸入分片,稱爲InputSplit,注意InputSplit不能跨越文件。隨後將爲這些輸入分片生成具體的Task。InputSplit與Task是一一對應的關係。隨後這些具體的Task每個都會被分配到集羣上的某個節點的某個Executor去執行。

若干個Block合併成一個輸入分片形成一個task,分配到executor執行

  1. 每個節點可以起一個或多個Executor。
  2. 每個Executor由若干core組成,每個Executor的每個core一次只能執行一個Task。
  3. 每個Task執行的結果就是生成了目標RDD的一個partiton。

注意: 這裏的core是虛擬的core而不是機器的物理CPU核,可以理解爲就是Executor的一個工作線程。而 Task被執行的併發度 = Executor數目 * 每個Executor核數。

partition的數目

  1. 對於數據讀入階段,例如sc.textFile,輸入文件被劃分爲多少InputSplit就會需要多少初始Task。
  2. 在Map階段partition數目保持不變。
  3. 在Reduce階段,RDD的聚合會觸發shuffle操作,聚合後的RDD的partition數目可以手動指定
  4. RDD在計算的時候,每個分區都會起一個task,所以rdd的分區數目決定了總的的task數目。申請的計算節點(Executor)數目和每個計算節點核數,決定了你同一時刻可以並行執行的task

BlockManager

BlockManager是整個Spark底層負責數據存儲與管理的一個組件

Driver上有BlockManagerMaster,負責對各個節點上的BlockManager內部管理的數據的元數據進行維護,比如block的增刪改等操作,都會在這裏維護好元數據的變更

每個節點都有一個BlockManager,每個BlockManager創建之後,第一件事即使去向BlockManagerMaster進行註冊,此時BlockManagerMaster會爲其長難句對應的BlockManagerInfo

在這裏插入圖片描述

BlockManagerMaster與BlockManager的關係非常像NameNode與DataNode的關係,BlockManagerMaster中保存中BlockManager內部管理數據的元數據,進行維護,當BlockManager進行Block增刪改等操作時,都會在BlockManagerMaster中進行元數據的變更,這與NameNode維護DataNode的元數據信息,DataNode中數據發生變化時NameNode中的元數據信息也會相應變化是一致的。

每個節點上都有一個BlockManager,BlockManager中有3個非常重要的組件:

  • DiskStore:負責對磁盤數據進行讀寫;
  • MemoryStore:負責對內存數據進行讀寫;
  • BlockTransferService:負責建立BlockManager到遠程其他節點的

BlockManager的連接,負責對遠程其他節點的BlockManager的數據進行讀寫;
每個BlockManager創建之後,做的第一件事就是想BlockManagerMaster進行註冊,此時BlockManagerMaster會爲其創建對應的BlockManagerInfo。

使用BlockManager進行寫操作時,比如說,RDD運行過程中的一些中間數據,或者我們手動指定了persist(),會優先將數據寫入內存中,如果內存大小不夠,會使用自己的算法,將內存中的部分數據寫入磁盤;此外,如果persist()指定了要replica,那麼會使用BlockTransferService將數據replicate一份到其他節點的BlockManager上去。

使用BlockManager進行讀操作時,比如說,shuffleRead操作,如果能從本地讀取,就利用DiskStore或者MemoryStore從本地讀取數據,但是本地沒有數據的話,那麼會用BlockTransferService與有數據的BlockManager建立連接,然後用BlockTransferService從遠程BlockManager讀取數據;例如,shuffle Read操作中,很有可能要拉取的數據在本地沒有,那麼此時就會到遠程有數據的節點上,找那個節點的BlockManager來拉取需要的數據。

只要使用BlockManager執行了數據增刪改的操作,那麼必須將Block的BlockStatus上報到BlockManagerMaster,在BlockManagerMaster上會對指定BlockManager的BlockManagerInfo內部的BlockStatus進行增刪改操作,從而達到元數據的維護功能

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