Spark作業的基本概念
Application:用戶自定義的Spark程序,用戶提交后,Spark為App分配資源將程序轉換并執行。
Driver Program:運行Application的main()函數并且創建SparkContext。
RDD DAG:當RDD遇到Action算子,將之前的所有算子形成一個有向無環圖(DAG)。再在Spark中轉化為Job,提交到集群進行執行。一個App中可以包含多Job。
Job:一個RDD Graph觸發的作業,往往由Spark Action算子觸發,在SparkContext中通過runJob方法向Spark提交Job。
Stage:每個Job會根據RDD的寬依賴關系被切分很多Stage,每個Stage中包含一組相同的Task,這一組Task也叫TaskSet。
Task:一個分區對應一個Task,Task執行RDD中對應Stage中所包含的算子。Task被封裝好后放入Executor的線程池中執行。Executor會在線程池中取得一個線程,分配給一個任務,之后任務執行完成,線程池回收線程。
Spark程序與作用概念映射
val rawFile = sc.textFile("README.md") //Application:1-6行
(將輸入的文本文件轉化為RDD)
val words = rawFile.flatMap(line=>line.split(" ")) //Job:1-5行
(將文本文件映射為word單詞,將文本文件進行分詞,轉換為一個單詞的RDD)
val wordNumber = words.map(w=>(w,1)) //Stage:1-3或4-5行
(將RDD中的每個單詞映射為,單詞名稱為key,value為1的kye-value對)
val wordCounts = wordNumber.reduceByKey(_+_) //Tasks:1-3或4-5行
(通過reduceBykey操作,將同一個單詞的數據進行聚集,進而統計好每一個單詞的個數)
wordCounts.foreach(println)
(foreach輸出每一個單詞的計數)
wordCounts.saveAsTextFile
(saveAsTextFile將結果保存到磁盤)
6行代碼對應為一個Application,這個應用程序中有兩個Job,1-5行是一個Job,1-4 + 6行是一個Job。
在1-5行這個Job中:
1-3行是一個stage,4-5行是一個stage,因為map和reduceByKey之間要進行shuffle操作。
Spark作業運行流程
1.Spark程序轉換,將應用程序提交到集群,集群將程序由一個application轉換成不同的任務集;
2.在集群中輸入數據塊;
3.集群會根據調度策略執行各個Stage的Tasks分發到各個節點,在每個數據塊上進行執行;
4.執行完成后,會根據shuffle在集群中將結果進行混洗,再進行下一階段的Stage,直到所有Stage執行完畢,輸出結果返回。