Spark工作機制(二)——Spark應用執行介紹

注:本博客文章在 https://yyddbull.github.io/coffeecat/  同步更新

瞭解了RDD概念後,介紹下Spark的工作機制:

1、惰性計算

首先,值得一提的是,Spark的RDD的Transformation操作都是惰性計算的,也就是隻有在執行Action操作的時候纔會真正開始計算。轉化操作不會立刻執行,而是在內部記錄下所要執行的操作的相關標識,等到了Action操作後再執行,Spark的這一個特性也叫做惰性計算。

這樣有什麼好處呢?舉個例子,假如textFile讀取文件數據,通過flatMap按照空格分隔後,再用fitler方法根據關鍵字過濾,最後調用first()返回數據集第一個元素,如果中途每個操作都要產生新的 RDD,那勢必會浪費很多內存空間,所以Spark在調用first操作的時候,纔會正常的執行計算,因此,我們調試Spark程序時,當斷點打在Transformation操作的函數中時,有時候會無法進入,只有當調用了Action操作時,纔會真正執行。

2、Spark應用執行組件

Spark應用的運行方式分爲Cluster模式和Client模式,其中Client模式是指Driver Program在任務提交機上執行,適用於交互和調試,也就是希望快速看到計算結果;而Cluster模式運行在ApplicationMaster中,一般應用在生產過程中。

這裏先解釋一些涉及的基本組件的概念:

Application:用戶自定義的Spark程序,包含1個Driver Program和若干個Executor進程。

Driver Program:運行Application的main()函數並且創建SparkContext,是應用的主控進程,負責應用的解析、切分Stage並調度Task到Executor進程上執行。

SparkContext:是spark應用程序的入口,負責調度各個運算資源,協調各個work node上的Executor。

Executor:是Application運行在work node上的一個進程,負責運行Task,一般每個Application都有各自獨立的executors,不同application的executor若不通過外部存儲,是無法進行數據交互的。

Master:集羣中的含有Master進程的節點,用於控制、管理和監督整個spark集羣。

Client:客戶端節點,負責客戶端進程,提交job到master。

Work Node:集羣的工作節點,接受Master的指令,運行Application的代碼,並向Master彙報進度。

Task:任務,一般一個RDD分區對應一個Task,是單個分區上最小的處理流程單元。

TaskSet:一組關聯的,但相互之間沒有Shuffle依賴關係的Task集合。

Stage:一個taskSet對應的調度階段,每個job會根據RDD的寬依賴關係被切分很多Stage,每個stage都包含 一個TaskSet。

Job:由Spark Action操作觸發的作業。

Spark幾個運行組件的關係如圖1所示:

                                                                     圖1  Spark應用組件的關係

3、Spark應用執行流程

Spark的應用提交有2種模式,一個是Driver進程在客戶端運行,一個是Master節點指定Driver進程在某個Work節點運行。

(1)Driver進程在客戶端運行

執行流程如圖2所示,

             

                                                                    圖2 Driver運行在Client

  • Client端啓動Driver進程,在Driver中啓動或實例化DAGScheduler等組件。
  • Worker向Master註冊,Master通過指令讓Worker啓動Executor。
  • Worker收到指令後創建ExecutorRunner線程,ExecutorRunner線程內部啓動ExecutorBackend進程。
  • ExecutorBackend啓動後,向Client端Driver進程內的SchedulerBackend註冊,這樣Dirver進程就可以發現計算資源了。
  • Driver的DAGScheduler解析應用中的RDD DAG並生成相應的Stage,每個Stage包含的TaskSet通過TaskScheduler分配給Executor,在Exectutor內部啓動線程池並行化執行Task
  • 當所有Stage被執行完了之後,各個Worker彙報給Driver,同時釋放資源,Driver向Master彙報,同時由於Driver在Client上,Clinet也知道應用的執行進度。

(2)Driver進程在Work節點運行

執行流程如圖3所示,

                     

                                                                 圖3 Driver運行在Worker節點

  • 客戶端提交應用程序給Master
  • Master調度應用,指定一個Worker節點啓動Driver。
  • Worker接收到Master命令後創建RriverRunner線程,在DriverRunner線程內創建SchedulerBackend進程,Dirver充當整個作業的主控進程。
  • Master指定其他Worker節點啓動Exeuctor,Worker創建ExecutorRunner線程,啓動ExecutorBackend進程,剩下流程與上面類似,不再贅述。
     
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章