Spark開發-spark執行原理和RDD

Xlucas發表於2017-09-13

核心
1、Spark執行原理
2、RDD

1、Spark執行原理
spark應用程式基本概念
application:基於spark的使用者程式,包含了driver program和叢集中多個executor
driver program:執行application的main()函式並且建立sparkcontext,通常用sparkcontext代表driver program
executor:是為某application執行在work node上的一個程式,該程式負責執行task,並且負責將資料存在記憶體或者磁碟上,每個application都有各自獨立的executors
cluster manager:在叢集上獲取資源的外部服務(例如 standalone,mesos,yarn)
worker node :叢集中任何可以執行application程式碼的節點
task :被送到某個executor上的工作單元
job :包含多個task組成的平行計算,往往由spark action催生,該術語可以經常在日誌中看到
stage:每個job會被拆分很多組task,每組任務被稱為stage,也可稱taskset,該術語可以經常在日誌中看到
RDD:spark的基本計算單元,可以通過一系列運算元進行操作(transformation 和action)

Spark基本工作流程
spark的application在執行的時候,首先在driver程式中會建立sparkcontext作為排程的總入口,在其初始化過程中會分別建立DAGScheduler進行stage排程和TaskScheduler進行task排程兩個模組,DAGScheduler模組是基於stage的排程模組,它為每個spark job計算具有依賴關係的多個stage任務階段,然後將每個stage劃分為具體的一組任務(通常會考慮資料的本地性等)以taskset的形式提交給底層的TaskScheduler模組來具體執行,TaskScheduler負責具體啟動任務,監控和彙報任務情況,而任務執行所需要的資源需要向cluster Manager申請

1個application包含了一個driver program ,1個Driver program 包含很多個job,1個job裡面包含很多個stage,1個stage裡面包含很多個task
這裡寫圖片描述

spark 應用程式程式設計模型
1、driver program (sparkcontext)
1、1匯入spark的類和隱式轉換
1、2構建spark應用程式的執行環境 sparkconf
1、3初始化sparkcontext
1、4關閉sparkcontext
1、5spark-shell在啟動的時候會自動構建sparkcontext名稱為sc
2、executor(RDD操作)
輸入 base–>RDD
transformation RDD–>RDD
action RDD—>driver or base
快取 persist or cache

2、RDD
RDD 彈性分散式資料集(Resilient Distributed DataSets):即一個RDD代表一個被分割槽的只讀資料集
RDD的建立只有3種方式
1、通過讀取資料獲取
val hdfsRDD= sc.textFile(“/input”) 會生成一個HadoopRDD 最後會轉換成一個MapPartitionsRDD
2、通過其他的RDD轉換來
3、通過已經存在的scala的集合
val collection = sc.parallelize(1 to 100000) 會生成一個 parallelCollectionRDD

RDD彈性特點
1、自動的進行記憶體和磁碟資料儲存的切換
2、自動血緣的高效容錯
3、task如果失敗會自動特點次數的容錯
4、stage失敗會自動特定次數的重試,只會重試失敗的stage

快取點:
1、計算特別耗時
2、計算鏈條很長
3、shuffle之後
4、checkpoint之前

建立操作(creation operation) RDD的初始建立都是由SparkContext來負責的,將記憶體中的集合或者外部檔案系統作為輸入源
轉換操作(transformation operation) 將一個RDD通過一定的操作變換成另一個RDD,比如file這個RDD就是通過filter操作變換成filterRDD的,所以filter就是一個轉換操作
控制操作(control operation) 對RDD進行持久化,可以讓RDD儲存在磁碟或者記憶體中,以便後續重複使用。比如cache介面預設將filterRDD快取在記憶體中
行動操作(action operation) 由於spark是惰性計算的,所以對於任何RDD進行行動操作,都會觸發spark作業的執行,從而產生最終的結果,例如,我們隊filterRDD進行的count操作就是
一個行動操作,spark中的行動操作基本分為2類,一類的操作結果變成Scala集合或者變數,另一類就是將RDD儲存到外部檔案或者資料庫系統中

RDD與操作之間的關係圖
這裡寫圖片描述

RDD 操作例項

scala> val data=sc.textFile("/input/passwd")
17/09/13 22:20:39 INFO storage.MemoryStore: Block broadcast_0 stored as values in memory (estimated size 229.9 KB, free 2.7 GB)
17/09/13 22:20:39 INFO storage.MemoryStore: Block broadcast_0_piece0 stored as bytes in memory (estimated size 19.5 KB, free 2.7 GB)
17/09/13 22:20:39 INFO storage.BlockManagerInfo: Added broadcast_0_piece0 in memory on 192.168.18.140:55227 (size: 19.5 KB, free: 2.7 GB)
17/09/13 22:20:39 INFO spark.SparkContext: Created broadcast 0 from textFile at <console>:27
data: org.apache.spark.rdd.RDD[String] = /input/passwd MapPartitionsRDD[1] at textFile at <console>:27

scala> data.toDebugString
17/09/13 22:20:50 INFO mapred.FileInputFormat: Total input paths to process : 1
res0: String = 
(2) /input/passwd MapPartitionsRDD[1] at textFile at <console>:27 []
 |  /input/passwd HadoopRDD[0] at textFile at <console>:27 []
//toDebugString方法會列印出RDD的家族關係
//可以看到textFile方法會生成兩個RDD,分別是HadoopRDD
//MapPartitionsRDD,而filter同時也會生成新的MapPartitionsRDD
scala> val flatted=data.flatMap(_.split(":"))
flatted: org.apache.spark.rdd.RDD[String] = MapPartitionsRDD[2] at flatMap at <console>:29

scala> val maped=flatted.map(word=>(word,1))
maped: org.apache.spark.rdd.RDD[(String, Int)] = MapPartitionsRDD[3] at map at <console>:31

scala> val reduced=maped.reduceByKey(_+_)
reduced: org.apache.spark.rdd.RDD[(String, Int)] = ShuffledRDD[4] at reduceByKey at <console>:33

scala> reduced.toDebugString
res1: String = 
(2) ShuffledRDD[4] at reduceByKey at <console>:33 []
 +-(2) MapPartitionsRDD[3] at map at <console>:31 []
    |  MapPartitionsRDD[2] at flatMap at <console>:29 []
    |  /input/passwd MapPartitionsRDD[1] at textFile at <console>:27 []
    |  /input/passwd HadoopRDD[0] at textFile at <console>:27 []

從spark ui上我們可以看到在做reduceByKey的時候spark做了stage的劃分,其實reduceByKey產生了一個ShuffledRDD

這裡寫圖片描述

相關文章