一、依賴關系
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAnYldHL0FWby9mZvwFN4ETMfdHLkVGepZ2XtxSZ6l2clJ3LcV2Zh1Wa9M3clN2byBXLzN3btgHL9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsQTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5yN4EDOyYmYhVGO2YDOxIjNzYzX4MjMxUTMyAzLcFTMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
寬依賴:有shuffle
子RDD的一個分區會依賴于父RDD的多個分區–錯誤
父EDD的一個分區會被子RDD的多個分區所依賴–正确
窄依賴:沒有shuffle
子RDD的一個分區會依賴于父RDD的1個分區–錯誤
父EDD的一個分區會被子RDD的1個分區所依賴–正确
為什麼要區分寬窄依賴
對窄依賴:并行化+容錯
寬依賴:進行階段劃分,(shuffle後的階段需要等待shuffle前的階段計算完才能執行)
二、DAG和Stage
DAG
Spark的DAG:就是spark任務/程式執行的流程圖
DAG的開始:從建立RDD開始
DAG的結束:到action結束
一個spark程式中有幾個Action操作就有幾個DAG
Stage
Stage:是DAG中根據shuffle劃分出來的階段!
前面的階段執行完才能執行後面的階段
如圖例:整個圖為DAG,根據shuffle劃分階段 左邊Stage1中有很多Task是并行運算的,不需要等待
也就是說同一個階段中的線程任務可以并行執行,無需等待
三、名詞解釋
在官網中
http://spark.apache.org/docs/2.4.5/cluster-overview.html
其實有解釋,如圖所示,Spark Application執行時涵蓋的很多概念都有解釋
此處我們進行一個簡短的翻譯
1.Application:應用,就是程式員編寫的Spark代碼,如wordcount代碼
2.Driver:驅動程式,就是用來執行main方法的JVM程序,裡面會執行一些Drive端的代碼,如建立sparkcontext,設定應用名,設定日志級别...
3.sparkContext:Spark運作時的上下文環境,用來和c1usterManager進行通信的,并進行資源的申請、任務的配置設定和監控等
4.c1usterManager:叢集管理器,對于standalone模式,就是Master,對于Yarn模式就是ResourceManager /ApplicationMaster ,在叢集上做統一的資源管理的程序
5.worker :工作節點,是擁有CPU/記憶體等資源的機器,是真正幹活的節點
6.Executor:運作在worker中的VM程序!
7.RDD:彈性分布式資料集
8.DAG:有向無環圖,就是根據Action形成的RDD的執行流程圖---靜态的圖
9.Job:作業,按照DAG進行執行就形成了Job---按照圖動态的執行
10.stage: DAG中,根據shuffle依賴劃分出來的一個個的執行階段!
11.Task:一個分區上的一系列操作(pip1ine上的一系列流水線操作)就是一個Task,同一個Stage中的多個Task可以并行執行!(一個Task由一個線程執行),是以也可以這樣說:Task(線程)是運作在Executor(程序)中的最小機關!
12.Taskset:任務集,就是同一個stage中的各個Task組成的集合!
結合官網中的圖進行了解
四、job送出執行流程
五、web-UI檢視
在執行個體中檢視,如圖所示,有5個job,由于job是的DAG的動态執行,是以理論上,有幾個job就有幾個DAG
點選其中一個job
檢視DAG
再打開一個job對應的DAG進行對比,發現多分割出了一部分,具體的原因是對應的算子shuffle-true即有shuffle就會分割