今天,我們就先聊一下spark中的DAG以及RDD的相關的內容
1.DAG:有向無環圖:有方向,無閉環,代表着數據的流向,這個DAG的邊界則是Action方法的執行
2.如何將DAG切分stage,stage切分的依據:有寬依賴的時候要進行切分(shuffle的時候,
也就是數據有網絡的傳遞的時候),則一個wordCount有兩個stage,
一個是reduceByKey之前的,一個事reduceByKey之后的(圖1),
則我們可以這樣的理解,當我們要進行提交上游的數據的時候,
此時我們可以認為提交的stage,但是嚴格意義上來講,我們提交的是Task
sets(Task的集合),這些Task可能業務邏輯相同,就是處理的數據不同
3.流程
構建RDD形成DAG遇到Action的時候,前面的stage先提交,提交完成之后再交給
下游的數據,在遇到TaskScheduler,這個時候當我們遇到Action的方法的時候,我們
就會讓Master決定讓哪些Worker來執行這個調度,但是到了最后我們真正的傳遞的
時候,我們用的是Driver給Worker傳遞數據(其實是傳遞到Excutor里面,這個里面執行
真正的業務邏輯),Worker中的Excutor只要啟動,則此后就和Master沒有多大關系了
4.寬窄依賴
RDD和它依賴的父RDD(s)的關系有兩種不同的類型,即窄依賴(narrow dependency)以及
寬依賴(wide dependency).
窄分區的划分依據,如果后面的一個RDD,前面的一個RDD有一個唯一對應的RDD,
則此時就是窄依賴,就相當於一次函數,y對應於一個x,而寬依賴則是類似於,前面的
一個RDD,則此時一個RDD對應多個RDD,就相當於二次函數,一個y對應多個x的值
5.DAG的生成
DAG(Directed Acyclic Graph)叫做有向無環圖,原始的RDD通過一系列的轉換就形成
DAG,根據RDD的之間的依賴關系的不同將DAG划分為不同的stage,對於窄依賴,
partition的轉換處理在stage中完成計算,對於寬依賴,由於有shuffle的存在,只能在
partentRDD處理完成后,才能開始接下來的計算,因此寬依賴是划分stage的依據
一般我們認為join是寬依賴,但是對於已經分好區的join來說,我們此時可以認為這個
時候的join是窄依賴