spark在Yarn上的資源調度和任務調度
目錄
一、spark的執行架構
spark代碼會分為兩部分:Driver端、Executor端
二、spark on yarn的資源調度(申請資源)
大數據引擎的執行過程:
1、資源調度(申請資源):申請CPU、內存、Executor的數量
2、任務調度(執行task)
1、spark on yarn client模式的執行流程圖
spark--粗粒度資源申請
spark會在任務執行之前將所有的資源全部申請下來。
task在執行的時候不需要再單獨申請資源,直接發送到Executor中執行,啟動快。
但是spark需要等待所有的task執行完成才會釋放資源,會導致資源浪費
MapReduce--細粒度資源申請
每一個task在執行的時候自己去申請資源。
task啟動之前需要先申請資源,啟動就會變慢,整個任務執行就會變慢。
每一個task單獨申請資源,不會占用額外的資源
Driver的功能是將task發送到Executor中執行。
Driver是知道整個任務執行進度的,在本地可以看到詳細的執行日志。
如果在本地提交大量的spark任務,會導致本地服務器的網卡流量劇增,
所以client模式一般用於上線前的測試,可以看到日志方便調試
2、spark on yarn cluster模式
yarn cluster模式,Driver不在本地啟動,在本地也沒有詳細的日志,
不會導致某台服務器網卡劇增,一般用於上線使用
三、spark on yarn的任務調度(執行task)
spark程序結構(由大到小)
1、Application:應用程序
2、Job:由action算子觸發(代碼中有多少action算子就有多少個Job)
3、stage:由寬依賴切分得到,是一組可以並行計算的task
4、task:線程對象,task中封裝了算子的代碼邏輯(底層會自動封裝)
Application:基於Spark的應用程序,包含了driver程序和集群上的executor DriverProgram:Driver代碼,算子之外的代碼。運行main函數並且新建SparkContext的程序 ClusterManager:在集群上獲取資源的外部服務(例如standalone,Mesos,Yarn ) WorkerNode:集群中任何可以運行應用用代碼的節點 Executor:執行task。 是在一個workernode上為某應用用啟動的一個進程,該進程負責運行任務, 並且負責將數據存在內存或者磁盤上。每個應用用都有各自自獨立的executors Task:數量由分區和shuffle決定。被送到某個executor上的執行單元 Job:包含很多任務的並行計算的task, 可以看做和Spark的action對應,每個action都會觸發一個job任務 Stage:一個Job會被拆分很多組任務,每組任務被稱為Stage (就像MapReduce分map任務和reduce任務一樣)
1、寬依賴和窄依賴
寬依賴:一分區對多分區,產生shuffle
窄依賴:一分區對 一分區,不產生shuffle
2、任務調度解釋說明
如果task執行失敗,Task調度器會重試3次再繼續執行task,
如果Task調度器重試3次失敗,DAG調度器會重試Task調度器4次,
如果DAG調度器會重試Task調度器4次失敗,那么就會報錯
3、資源調度和任務調度的執行流程圖(yarn client模式)
如果task執行失敗,TaskScheduler會重試3次,如果還失敗,由DAGScheduler重試Stage4次。
如果是因為shuffle文件找不到出現的溢出,TaskScheduler不負責重試task,
而是由DAGScheduler重試上一個Stage
推測執行:如果有一個task執行很慢,TaskScheduler會再發送一個一樣的task去競爭