Spark 相關概念介紹、架構原理、作業執行流程簡介

這篇文章主要介紹 spark 的相關名詞概念,和作業的執行流程,任務分配,希望通過這篇文章可以幫助大家對 spark 有一個更深層次的的理解。

名詞解釋:

1. Standalone模式下存在的角色。
Client:客戶端進程,負責提交作業到Master。
Master:Standalone模式中主控節點,負責接收Client提交的作業,管理Worker,并命令Worker啟動Driver和Executor。
Worker:Standalone模式中slave節點上的守護進程,負責管理本節點的資源,定期向Master匯報心跳,接收Master的命令,啟動Driver和Executor。
Driver: 一個Spark作業運行時包括一個Driver進程,也是作業的主進程,負責作業的解析、生成Stage并調度Task到Executor上。包括DAGScheduler,TaskScheduler。
Executor:即真正執行作業的地方,一個集群一般包含多個Executor,每個Executor接收Driver的命令Launch Task,一個Executor可以執行一到多個Task。

2.作業相關的名詞解釋

Job: 在用戶程序中, 每次調用Action函數都會產生一個新的job, 也就是說一個Action都會生成一個job.

Stage:一個Spark作業一般包含一到多個Stage。
Task:一個Stage包含一到多個Task,通過多個Task實現并行運行的功能。
DAGScheduler: 實現將Spark作業分解成一到多個Stage,每個Stage根據RDD的Partition個數決定Task的個數,然后生成相應的Task set放到TaskScheduler中。

TaskScheduler:實現Task分配到Executor上執行。

3、spark 根據 job 劃分 stage 的過程
構建RDD之間的依賴關系. 具體來說依賴有寬窄之分, 如果子RDD中的每個分區依賴常數個父RDD中的分區, 我們把這種依賴叫做窄依賴; 如果子RDD中的每個數據分片依賴父RDD的所有分片, 我們把這種依賴叫做寬依賴.

 在這兒我們在引入一個新的詞匯lineage

, 在spark中每個RDD都攜帶自己的lineage. 而lineage就是通過RDD之間的依賴來表示的.



wide-narrow-dependency

我們通過這幅圖可以大概看一下寬窄依賴到底是這么回事. 圖中矩形框圍住的部分是RDD, 實心小矩形是Partition.
接下來我們看一下Spark是如何構建DAG的. 當用戶調用Action函數時, 調度器會逆向的遍歷該RDD的lineage, 每個stage會嘗試盡可能多包含那些連續的窄依賴. 如果當前的Stage向上回溯的過程中遇到了寬依賴, 則當前Stage結束, 一個新的Stage被構建. 第二個Stage是第一個Stage的parent. 還有一種情況也會結束當前Stage, 那就是那個partition已經被計算出來, 換存在內存中, 這種情況下我們就不必作多余的計算了.

 簡單的說就是遇到寬依賴, 就生成新的Stage. 寬依賴會觸發shuffle. 我們來看上邊代碼的visit函數: 拿到RDD的所有的dependency, 如果是窄依賴那么繼續查找依賴的RDD的parent; 如果是寬依賴, 則調用getShuffleMapStage把生成的Stage加到當前stage的parents中. 該函數執行完畢, 則整個DAG就構建完成.

兩種方式的作業運行原理

Driver運行在Worker上
通過org.apache.spark.deploy.Client類執行作業,作業運行命令如下:
./bin/spark-class org.apache.spark.deploy.Client launch spark://host:port file:///jar_url org.apache.spark.examples.SparkPi spark://host:port
作業執行流如圖1所示。


作業執行流程描述:

  1. 客戶端提交作業給Master

  2. Master讓一個Worker啟動Driver,即SchedulerBackend。Worker創建一個DriverRunner線程,DriverRunner啟動SchedulerBackend進程。

  3. 另外Master還會讓其余Worker啟動Exeuctor,即ExecutorBackend。Worker創建一個ExecutorRunner線程,ExecutorRunner會啟動ExecutorBackend進程。

  4. ExecutorBackend啟動后會向Driver的SchedulerBackend注冊。SchedulerBackend進程中包含DAGScheduler,它會根據用戶程序,生成執行計劃,并調度執行。對于每個stage的task,都會被存放到TaskScheduler中,ExecutorBackend向SchedulerBackend匯報的時候把TaskScheduler中的task調度到ExecutorBackend執行。

  5. 所有stage都完成后作業結束。

Driver運行在客戶端
直接執行Spark作業,作業運行命令如下(示例):
./bin/run-example org.apache.spark.examples.SparkPi spark://host:port
作業執行流如圖2所示。


圖2
作業執行流程描述:

  1. 客戶端啟動后直接運行用戶程序,啟動Driver相關的工作:DAGScheduler和BlockManagerMaster等。

  2. 客戶端的Driver向Master注冊。

  3. Master還會讓Worker啟動Exeuctor。Worker創建一個ExecutorRunner線程,ExecutorRunner會啟動ExecutorBackend進程。

  4. ExecutorBackend啟動后會向Driver的SchedulerBackend注冊。Driver的DAGScheduler解析作業并生成相應的Stage,每個Stage包含的Task通過TaskScheduler分配給Executor執行。

  5. 所有stage都完成后作業結束。
    基于Yarn的Spark架構與作業執行流程


    這里Spark AppMaster相當于Standalone模式下的SchedulerBackend,Executor相當于standalone的ExecutorBackend,spark AppMaster中包括DAGScheduler和YarnClusterScheduler。
    Spark on Yarn的執行流程可以參考http://www.csdn.net/article/2013-12-04/2817706--YARN spark on Yarn部分。
    這里主要介紹一下Spark ApplicationMaster的主要工作。代碼參考Apache Spark 0.9.0版本ApplicationMaster.scala中的run()方法。
    步驟如下:

  6. 設置環境變量spark.local.dir和spark.ui.port。NodeManager啟動ApplicationMaster的時候會傳遞LOCAL_DIRS(YARN_LOCAL_DIRS)變量,這個變量會被設置為spark.local.dir的值。后續臨時文件會存放在此目錄下。

  7. 獲取NodeManager傳遞給ApplicationMaster的appAttemptId。

  8. 創建AMRMClient,即ApplicationMaster與ResourceManager的通信連接。

  9. 啟動用戶程序,startUserClass(),使用一個線程通過發射調用用戶程序的main方法。這時候,用戶程序中會初始化SparkContext,它包含DAGScheduler和TaskScheduler。

  10. 向ResourceManager注冊。

  11. 向ResourceManager申請containers,它根據輸入數據和請求的資源,調度Executor到相應的NodeManager上,這里的調度算法會考慮輸入數據的locality。

文章如有錯漏還望多批評指正。

文章參考鏈接:
Spark Job執行流程源碼解析
Spark架構與作業執行流程簡介

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,578評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,701評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,691評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,974評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,694評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,026評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,015評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,193評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,719評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,442評論 3 360
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,668評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,151評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,846評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,255評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,592評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,394評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,635評論 2 380

推薦閱讀更多精彩內容