Spark 相關概念介紹吆豹、架構原理、作業(yè)執(zhí)行流程簡介

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

名詞解釋:

1. Standalone模式下存在的角色。
Client:客戶端進程宙橱,負責提交作業(yè)到Master姨俩。
Master:Standalone模式中主控節(jié)點蘸拔,負責接收Client提交的作業(yè),管理Worker环葵,并命令Worker啟動Driver和Executor调窍。
Worker:Standalone模式中slave節(jié)點上的守護進程,負責管理本節(jié)點的資源张遭,定期向Master匯報心跳邓萨,接收Master的命令,啟動Driver和Executor菊卷。
Driver: 一個Spark作業(yè)運行時包括一個Driver進程缔恳,也是作業(yè)的主進程,負責作業(yè)的解析洁闰、生成Stage并調度Task到Executor上歉甚。包括DAGScheduler,TaskScheduler扑眉。
Executor:即真正執(zhí)行作業(yè)的地方纸泄,一個集群一般包含多個Executor,每個Executor接收Driver的命令Launch Task腰素,一個Executor可以執(zhí)行一到多個Task刃滓。

2.作業(yè)相關的名詞解釋

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

Stage:一個Spark作業(yè)一般包含一到多個Stage。
Task:一個Stage包含一到多個Task耸弄,通過多個Task實現(xiàn)并行運行的功能咧虎。
DAGScheduler: 實現(xiàn)將Spark作業(yè)分解成一到多個Stage,每個Stage根據(jù)RDD的Partition個數(shù)決定Task的個數(shù)计呈,然后生成相應的Task set放到TaskScheduler中砰诵。

TaskScheduler:實現(xiàn)Task分配到Executor上執(zhí)行。

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

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

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



wide-narrow-dependency

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

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

兩種方式的作業(yè)運行原理

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


作業(yè)執(zhí)行流程描述:

  1. 客戶端提交作業(yè)給Master

  2. Master讓一個Worker啟動Driver扶歪,即SchedulerBackend理肺。Worker創(chuàng)建一個DriverRunner線程,DriverRunner啟動SchedulerBackend進程善镰。

  3. 另外Master還會讓其余Worker啟動Exeuctor妹萨,即ExecutorBackend。Worker創(chuàng)建一個ExecutorRunner線程炫欺,ExecutorRunner會啟動ExecutorBackend進程乎完。

  4. ExecutorBackend啟動后會向Driver的SchedulerBackend注冊。SchedulerBackend進程中包含DAGScheduler品洛,它會根據(jù)用戶程序树姨,生成執(zhí)行計劃摩桶,并調度執(zhí)行。對于每個stage的task帽揪,都會被存放到TaskScheduler中硝清,ExecutorBackend向SchedulerBackend匯報的時候把TaskScheduler中的task調度到ExecutorBackend執(zhí)行。

  5. 所有stage都完成后作業(yè)結束转晰。

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


圖2
作業(yè)執(zhí)行流程描述:

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

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

  3. Master還會讓Worker啟動Exeuctor侠坎。Worker創(chuàng)建一個ExecutorRunner線程蚁趁,ExecutorRunner會啟動ExecutorBackend進程。

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

  5. 所有stage都完成后作業(yè)結束庐完。
    基于Yarn的Spark架構與作業(yè)執(zhí)行流程


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

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

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

  8. 創(chuàng)建AMRMClient褐望,即ApplicationMaster與ResourceManager的通信連接勒庄。

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

  10. 向ResourceManager注冊。

  11. 向ResourceManager申請containers漆腌,它根據(jù)輸入數(shù)據(jù)和請求的資源贼邓,調度Executor到相應的NodeManager上,這里的調度算法會考慮輸入數(shù)據(jù)的locality闷尿。

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

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市填具,隨后出現(xiàn)的幾起案子统舀,更是在濱河造成了極大的恐慌,老刑警劉巖劳景,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件誉简,死亡現(xiàn)場離奇詭異,居然都是意外死亡盟广,警方通過查閱死者的電腦和手機闷串,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來筋量,“玉大人烹吵,你說我怎么就攤上這事〗拔洌” “怎么了肋拔?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長呀酸。 經(jīng)常有香客問我凉蜂,道長,這世上最難降的妖魔是什么性誉? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任窿吩,我火速辦了婚禮,結果婚禮上艾栋,老公的妹妹穿的比我還像新娘爆存。我一直安慰自己,他們只是感情好蝗砾,可當我...
    茶點故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布先较。 她就那樣靜靜地躺著,像睡著了一般悼粮。 火紅的嫁衣襯著肌膚如雪闲勺。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天扣猫,我揣著相機與錄音菜循,去河邊找鬼。 笑死申尤,一個胖子當著我的面吹牛癌幕,可吹牛的內容都是我干的衙耕。 我是一名探鬼主播,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼勺远,長吁一口氣:“原來是場噩夢啊……” “哼橙喘!你這毒婦竟也來了?” 一聲冷哼從身側響起胶逢,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤厅瞎,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后初坠,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體和簸,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年碟刺,在試婚紗的時候發(fā)現(xiàn)自己被綠了锁保。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,427評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡南誊,死狀恐怖身诺,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情抄囚,我是刑警寧澤霉赡,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站幔托,受9級特大地震影響穴亏,放射性物質發(fā)生泄漏。R本人自食惡果不足惜重挑,卻給世界環(huán)境...
    茶點故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一嗓化、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧谬哀,春花似錦刺覆、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至篇梭,卻和暖如春氢橙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背恬偷。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工悍手, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓坦康,卻偏偏與公主長得像竣付,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子涝焙,可洞房花燭夜當晚...
    茶點故事閱讀 45,440評論 2 359

推薦閱讀更多精彩內容