天天看點

Spark-運作時架構

Spark運作時架構

在分布式環境下,Spark叢集采用的時主/從結構。在一個Spark叢集中,有一個節點負責中央協調,排程各個分布式工作節點。這個中央協調節點被稱為驅動器(Driver),與之對應的工作節點被稱為執行器節點(executor).驅動器節點可以和大量的執行器節點進行通信,它們也都作為獨立的Java程序運作。驅動器節點和執行器節點一起被稱為一個Spark應用(application)

Spark應用通過一個叫做叢集管理器(Cluster Manager)的外部服務在叢集中的機器上啟動。Spark自帶的叢集管理器被稱為獨立叢集管理器。Spark也能運作在Hadoop YARN和Apache Mesos這兩大開源叢集機器上。

驅動器節點

Spark驅動器是執行程式中的main()方法的程序。它執行使用者編寫的用來建立SparkContext、建立RDD,以及進行RDD的轉化操作和行動操作的代碼。其實,當你啟動Spark shell時,你就啟動了一個Spark驅動器程式(Spark shell總是會預先加載一個叫做sc的SparkContext對象)。驅動器程式一旦終止,Spark應用也就結束了。

驅動器程式在Spark應用中有兩個職責

1.把使用者程式轉為任務

2.為執行器節點排程任務

把使用者程式轉為任務

Spark驅動器程式負責把使用者程式轉為多個實體執行的單元,這些單元也被稱為任務(task)。從上層來看,所有的Spark程式都遵循同樣的結構:程式從輸入資料建立一系列RDD,再使用轉化操作派生出新的RDD,最後使用行動操作手機或存儲結果RDD中的資料。Spark程式其實是隐式的建立出了一個由操作組成的邏輯上的有向無環圖(Directed Acyclic Graph,簡稱DAG)。當驅動器程式運作時,它會把這個邏輯圖轉為實體執行計劃。

Spark會對邏輯執行計劃作一些優化,比如将連續的映射轉為流水線化執行,将多個操作合并到一個步驟中等。這樣Spark就把邏輯計劃轉為一系列步驟(stage).而每個步驟又由多個任務組成。這些任務會被打包并送到叢集中。任務是Spark中最小的工作單元,使用者程式通常要啟動成百上千的獨立任務。

為執行器節點排程任務

有了實體計劃後,Spark驅動器程式必須在各執行器程序間協調人物的排程。執行器程序啟動後,會向驅動器程序注冊自己,是以,驅動器程序始終對應用中所有的執行器節點有完整的記錄。每個執行器節點代表一個能夠處理任務和存儲RDD資料的程序。

Spark驅動器程式會根據目前的執行器節點集合,嘗試把所有任務基于資料所在位置配置設定給合适的執行器程序。當任務執行時,執行器程序會把緩存資料存儲起來,而驅動器程序同樣會跟蹤這些緩存資料的位置,并且利用這些位置資訊來排程以後的任務,以盡量減少資料的網絡傳輸。

驅動器程式會将一些Spark應用的運作時的資訊通過網頁界面呈現出來,預設在端口4040上。

執行器節點

叢集管理器

繼續閱讀