Spark開發-spark執行原理和RDD
核心
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
相關文章
- Spark開發-Spark執行模式及原理一Spark模式
- Spark RDD使用詳解--RDD原理Spark
- spark基礎之spark sql執行原理和架構SparkSQL架構
- Spark開發-RDD介面程式設計Spark程式設計
- Spark的執行原理Spark
- spark執行原理、模型Spark模型
- Spark RDD在Spark中的地位和作用如何?Spark
- Spark RDD APISparkAPI
- spark-RDDSpark
- 【Spark】 Spark作業執行原理--獲取執行結果Spark
- Spark開發-RDD分割槽重新劃分Spark
- Spark原理-物理執行圖Spark
- Spark - [03] RDD概述Spark
- Spark 的核心概念 RDDSpark
- Spark Basic RDD 操作示例Spark
- Spark RDD的預設分割槽數:(spark 2.1.0)Spark
- Spark(十三) Spark效能調優之RDD持久化Spark持久化
- SparkSQL /DataFrame /Spark RDD誰快?SparkSQL
- Spark RDD 特徵及其依賴Spark特徵
- spark學習筆記--RDDSpark筆記
- Spark修煉之道(進階篇)——Spark入門到精通:第七節 Spark執行原理Spark
- Spark開發-執行架構基本概念Spark架構
- 深入原始碼理解Spark RDD的資料分割槽原理原始碼Spark
- 本地開發spark程式碼上傳spark叢集服務並執行(基於spark官網文件)Spark
- Spark資料收藏--------Spark執行架構Spark架構
- Spark學習(二)——RDD基礎Spark
- 【大資料】Spark RDD基礎大資料Spark
- spark RDD,reduceByKey vs groupByKeySpark
- Spark RDD中Runtime流程解析Spark
- spark常用RDD介紹及DemoSpark
- Spark開發-Spark核心細說Spark
- Spark開發-spark環境搭建Spark
- Spark叢集和任務執行Spark
- spark學習筆記--叢集執行SparkSpark筆記
- Spark從入門到放棄---RDDSpark
- 快取Apache Spark RDD - 效能調優快取ApacheSpark
- 大白話講解Spark中的RDDSpark
- RDD程式設計 上(Spark自學三)程式設計Spark