Spark調度解析

目錄

Spark調度解析 

1.相關術語

2.作業、階段、任務之間的關係

如何劃分作業(Job)

如何劃分階段(Stage)

如何劃分任務(Task)

總結

3.Spark運行流程

參考文獻


Spark調度解析 

1.相關術語

Application:Spark Application的概念和Hadoop MapReduce中的類似,指的是用戶編寫的Spark應用程序,包含了一個Driver 功能的代碼和分佈在集羣中多個節點上運行的Executor代碼;

Driver:Spark中的Driver即運行上述Application的main()函數並且創建SparkContext,其中創建SparkContext的目的是爲了準備Spark應用程序的運行環境。在Spark中由SparkContext負責和ClusterManager通信,進行資源的申請、任務的分配和監控等;當Executor部分運行完畢後,Driver負責將SparkContext關閉。通常用SparkContext代表Driver;

Executor:Application運行在Worker 節點上的一個進程,該進程負責運行Task,並且負責將數據存在內存或者磁盤上,每個Application都有各自獨立的一批Executor。

Cluster Manager:指的是在集羣上獲取資源的外部服務,目前有:

a.  Standalone:Spark原生的資源管理,由Master負責資源的分配;

b.  Hadoop Yarn:由YARN中的ResourceManager負責資源的分配;

Worker:集羣中任何可以運行Application代碼的節點,類似於YARN中的NodeManager節點。在Standalone模式中指的就是通過Slave文件配置的Worker節點,在Spark on Yarn模式中指的就是NodeManager節點;

作業(Job):包含多個Task組成的並行計算,往往由Spark Action催生,一個JOB包含多個RDD及作用於相應RDD上的各種Operation;

階段(Stage):每個Job會被拆分很多組Task,每組任務被稱爲Stage,也可稱TaskSet,一個作業分爲多個階段;

任務(Task): 被送到某個Executor上的工作任務

2.作業、階段、任務之間的關係

總體而言,在spark中,一個應用(Application)由一個任務控制節點(Driver)和若干個作業(Job)組成,一個作業(Job)由多個階段(Stage)組成,一個階段(Stage)由多個任務(Task)組成。

如何劃分作業(Job)

RDD提供了一組豐富的操作來支持常見的數據運算,他們分爲行動(Action)轉換(Transformation)兩類。前者用來執行計算並且輸出,後者指定RDD之間的依賴關係。

說得具體一點就是,轉換操作(如map、filter、groupBy、join等)的輸入是一個RDD,輸出也是一個RDD,這樣就建立了兩個RDD之間的依賴,而在Spark中轉換(Transformation)是延遲執行的,也就是說轉換並不立即執行;而行動操作(如count、collect)的輸入是RDD,但是輸出是非RDD形式,也就是數據結果集合,而Action操作會立即執行。

也就是說,在Application中,是根據Action來劃分Job的,對於Transformation,Spark只是記錄下參與的數據集RDD和生成的軌跡,當遇到Action操作時,纔會將其與之前的Transformation操作打包成一個Job,進行計算。

如何劃分階段(Stage)

RDD中不同的操作會使得不同的RDD分區中產生不同的依賴。它們分爲窄依賴(Narrow Dependency)寬依賴(Wide Dependency)

如下圖所示,其中一個大矩形表示一個RDD,RDD中的小矩形表示一個Partition分區。豎線左邊爲窄依賴,右邊爲寬依賴。

簡單的說,如果父RDD中的分區Partition與子RDD中的分區的關係是一對一或多對一的關係,則爲窄依賴,否則爲寬依賴。而在Job中,遇到寬依賴,就會劃分一下階段。

DAG優化:一個job會被切分爲多個stage,碰到寬依賴就會切分一下。

如何劃分任務(Task)

劃分了階段後,就可以保證Stage1和Stage2中RDD之間都是窄依賴,這樣分區之間的操作可以形成一個流水線(Pipeline)操作,Spark會將每條Pipeline封裝成一個任務(Task),就比如上圖中Stage2中存在4個Task,C到D中第一個分區執行完map操作,不用等待第二個分區執行完map操作,直接可以立即執行union操作,能夠大大提高計算效率。

總結

(1)創建RDD對象。

(2)SparkContext負責計算RDD之間的依賴關係,劃分Job,構建DAG。這個過程都是在Driver上完成。

(3) DAGScheduler負責將DAG圖分解成多個Stage,每個Stage中包含多個Task,然後每個Task會被任務調度器分發給各個Worker上去被Executor執行。

3.Spark運行流程

詳細過程都在圖上了,有點潦草,將就着看。^_^

參考文獻

[1]https://www.cnblogs.com/shishanyuan/p/4721326.html

[2]大數據技術原理與應用(第二版,人民郵電出版社)

 

 

 

 

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