一、YARN是集群的資源管理系統(tǒng)
1、ResourceManager:負責整個集群的資源管理和分配。
2、ApplicationMaster:YARN中每個Application對應一個AM進程,負責與RM協(xié)商獲取資源,獲取資源后告訴NodeManager為其分配并啟動Container。
3、NodeManager:每個節(jié)點的資源和任務管理器,負責啟動/停止Container,并監(jiān)視資源使用情況。
4、Container:YARN中的抽象資源。
二、 SPARK的概念
1、Driver:和ClusterManager通信,進行資源申請、任務分配并監(jiān)督其運行狀況等。運行程序的main方法,創(chuàng)建spark context對象。具體的:1)driver是作業(yè)的主進程,具有main函數,并且有SparkContext的實例,是程序的人口點;2)功能:負責向集群申請資源,向master注冊信息,負責了作業(yè)的調度,,負責作業(yè)的解析、生成Stage并調度Task到Executor上。包括DAGScheduler,TaskScheduler。
2、ClusterManager:這里指YARN。
3、DAGScheduler:把spark作業(yè)轉換成Stage的DAG圖。
4、TaskScheduler:把Task分配給具體的Executor。
5、一個application對應一個sparkcontext,app中存在多個job,每個job在不同partition上的執(zhí)行稱為task。
6、client:用戶提交程序的入口。
7、worker: worker就類似于包工頭。主要功能:管理當前節(jié)點內存,CPU的使用狀況,接收master分配過來的資源指令,通過ExecutorRunner啟動程序分配任務。注意:1)worker不會匯報當前信息給master,worker心跳給master主要只有workid,它不會發(fā)送資源信息以心跳的方式給mater,master分配的時候就知道work,只有出現(xiàn)故障的時候才會發(fā)送資源。2)worker不會運行代碼,具體運行的是Executor是可以運行具體appliaction寫的業(yè)務邏輯代碼,操作代碼的節(jié)點,它不會運行程序的代碼的。
三、 SPARK on YARN
1. yarn on cluster
(1)ResourceManager接到請求后在集群中選擇一個NodeManager分配Container,并在Container中啟動ApplicationMaster進程;
(2)在ApplicationMaster進程中初始化sparkContext;
(3)ApplicationMaster向ResourceManager申請到Container后,通知NodeManager在獲得的Container中啟動excutor進程;
(4)sparkContext分配Task給excutor,excutor發(fā)送運行狀態(tài)給ApplicationMaster。

2. yarn on client
(1)ResourceManager接到請求后在集群中選擇一個NodeManager分配Container,并在Container中啟動ApplicationMaster進程;
(2)driver進程運行在client中,并初始化sparkContext;
(3)sparkContext初始化完后與ApplicationMaster通訊,通過ApplicationMaster向ResourceManager申請Container,ApplicationMaster通知NodeManager在獲得的Container中啟動excutor進程;
(4)sparkContext分配Task給excutor,excutor發(fā)送運行狀態(tài)給driver。

3. 區(qū)別
- 它們的區(qū)別就是ApplicationMaster的區(qū)別:yarn-cluster中ApplicationMaster不僅負責申請資源,并負責監(jiān)控Task的運行狀況,因此可以關掉client;而yarn-client中ApplicationMaster僅負責申請資源,由client中的driver來監(jiān)控調度Task的運行,因此不能關掉client。
- client適合調試,dirver運行在客戶端; cluster適合生產,driver運行在集群子節(jié)點,具有容錯功能
四、 job stage task
- job : A job is triggered by an action, like count() or saveAsTextFile(). Click on a job to see information about the stages of tasks inside it. 所謂一個 job,就是由一個 rdd 的 action 觸發(fā)的動作,可以簡單的理解為,當你需要執(zhí)行一個 rdd 的 action 的時候,會生成一個 job。
- stage : stage 是一個 job 的組成單位,就是說,一個 job 會被切分成 1 個或 1 個以上的 stage,然后各個 stage 會按照執(zhí)行順序依次執(zhí)行。由job->stage,其劃分原則是從寬依賴分隔。因為從寬依賴,所以子RDD的partition會依賴多個父RDD的partition,有些可能就沒有準備好,所以進行劃分處理。
- task : A unit of work within a stage, corresponding to one RDD partition。即 stage 下的一個任務執(zhí)行單元,一般來說,一個 rdd 有多少個 partition,就會有多少個 task,因為每一個 task 只是處理一個 partition 上的數據。
- spark作業(yè)提交流程:
Spark任務會根據RDD之間的依賴關系,形成一個DAG有向無環(huán)圖,DAG會提交給DAGScheduler,DAGScheduler會把DAG劃分相互依賴的多個stage,劃分stage的依據就是RDD之間的寬窄依賴。遇到寬依賴就劃分stage,每個stage包含一個或多個task任務。然后將這些task以taskSet的形式提交給TaskScheduler運行。 -
stage切割規(guī)則:從后往前,遇到寬依賴就切割stage
stage_task.png - spark工作機制:
答:用戶在client端提交作業(yè)后,會由Driver運行main方法并創(chuàng)建spark context上下文。
執(zhí)行add算子,形成dag圖輸入dagscheduler,按照add之間的依賴關系劃分stage輸入task scheduler。 task scheduler會將stage劃分為task set分發(fā)到各個節(jié)點的executor中執(zhí)行。
五、 RDD之間的寬依賴、窄依賴
- 窄依賴:表示父親 RDD 的一個分區(qū)最多被子 RDD 一個分區(qū)所依賴。有shuffle產生,父RDD的一個分區(qū)的數據去到子RDD的不同分區(qū)里
例如:map filter union - 寬依賴:表示父親 RDD 的一個分區(qū)可以被子 RDD 的多個子分區(qū)所依賴。沒有shuffle產生,父的一個分區(qū)數據到了子RDD的一個分區(qū)
例如:groupByKey group sort
