Spark Core
1、Spark架構設計
1.1 架構設計圖
1.2 相關術語名詞解釋
-
RDD (Resilient Distributed DataSet)
-
彈性分佈式數據集,是對數據集在spark存儲和計算過程中的一種抽象。
-
是一組只讀、可分區的的分佈式數據集合。
-
一個RDD 包含多個分區Partition(類似於MapReduce中的InputSplit),分區是依照一定的規則的,將具有相同規則的屬性的數據記錄放在一起。
-
橫向上可切分並行計算,以分區Partition爲切分後的最小存儲和計算單元。
-
縱向上可進行內外存切換使用,即當數據在內存不足時,可以用外存磁盤來補充。
-
-
Partition(分區)
- Partition類似hadoop的Split,計算是以partition爲單位進行的,提供了一種劃分數據的方式。
- partition的劃分依據有很多,可以自己定義的,像HDFS文件,劃分的方式就和MapReduce一樣,以文件的block來劃分不同的partition。
- 一個Partition交給一個Task去計算處理
-
算子
- 英文簡稱:Operator
- 廣義上講,對任何函數進行某一項操作都可以認爲是一個算子
- 通俗上講,算子即爲映射、關係、變換。
- MapReduce算子,主要分爲兩個,即爲Map和Reduce兩個主要操作的算子,導致靈活可用性比較差。
- Spark算子,分爲兩大類,即爲Transformation和Action類,合計有80多個。
-
Transformation類算子
- 操作是延遲計算的,也就是說從一個RDD 轉換生成另一個 RDD 的轉換操作不是馬上執行,需要等到有 Action
操作的時候纔會真正觸發運算。 - 細分類
- Value數據類型的Transformation算子
- Key-Value數據類型的Transfromation算子
- 操作是延遲計算的,也就是說從一個RDD 轉換生成另一個 RDD 的轉換操作不是馬上執行,需要等到有 Action
-
Action類算子
- 會觸發 Spark 提交作業(Job),並將數據輸出 Spark系統。
-
窄依賴
- 如果一個父RDD的每個分區只被子RDD的一個分區使用 ----> 一對一關係
-
寬依賴
- 如果一個父RDD的每個分區要被子RDD 的多個分區使用 ----> 一對多關係
-
Application
- Spark Application的概念和MapReduce中的job或者yarn中的application類似,指的是用戶編寫的Spark應用程序,包含了一個Driver功能的代碼和分佈在集羣中多個節點上運行的Executor代碼
- 一般是指整個Spark項目從開發、測試、佈署、運行的全部。
-
Driver
- 運行main函數並且創建SparkContext的程序。
- 稱爲驅動程序,Driver Program類似於hadoop的wordcount程序的main函數。
-
Cluster Manager
- 集羣的資源管理器,在集羣上獲取資源的服務。如Yarn、Mesos、Spark Standalone等。
- 以Yarn爲例,驅動程序會向Yarn申請計算我這個任務需要多少的內存,多少CPU等,後由Cluster Manager會通過調度告訴驅動程序可以使用,然後驅動程序將任務分配到既定的Worker Node上面執行。
-
WorkerNode
- 集羣中任何一個可以運行spark應用代碼的節點。
- Worker Node就是物理機器節點,可以在上面啓動Executor進程。
-
Executor
- Application運行在Worker節點上的一個進程,該進程負責運行Task,並且負責將數據存在內存或者磁盤上,每個Application都有各自獨立專享的一批Executor。
- Executor即爲spark概念的資源容器,類比於yarn的container容器,真正承載Task的運行與管理,以多線程的方式運行Task,更加高效快速。
-
Task
- 與Hadoop中的Map Task或者Reduce Task是類同的。
- 分配到executor上的基本工作單元,執行實際的計算任務。
- Task分爲兩類,即爲ShuffleMapTask和ResultTask。
- ShuffleMapTask:即爲Map任務和發生Shuffle的任務的操作,由Transformation操作組成,其輸出結果是爲下個階段任務(ResultTask)進行做準備,不是最終要輸出的結果。
- ResultTask:即爲Action操作觸發的Job作業的最後一個階段任務,其輸出結果即爲Application最終的輸出或存儲結果。
-
Job(作業)
- Spark RDD裏的每個action的計算會生成一個job。
- 用戶提交的Job會提交給DAGScheduler(Job調度器),Job會被分解成Stage去執行,每個Stage由一組相同計算規則的Task組成,該組Task也稱爲TaskSet,實際交由TaskScheduler去調度Task的機器執行節點,最終完成作業的執行。
-
Stage(階段)
-
Stage是Job的組成部分,每個Job可以包含1個或者多個Stage。
-
Job切分成Stage是以Shuffle作爲分隔依據,Shuffle前是一個Stage,Shuffle後是一個Stage。即爲按RDD寬窄依賴來劃分Stage。
-
每個Job會被拆分很多組Task,每組任務被稱爲Stage,也可稱TaskSet,一個作業可以被分爲一個或多個階段
-
2、spark運行模式與用戶交互方式
2.1運行模式
即作業以什麼樣的模式去執行,主要是單機、分佈式兩種方式的細節選擇。
2.2用戶交互方式
1、spark-shell:spark命令行方式來操作spark作業。
多用於簡單的學習、測試、簡易作業操作。
2、spark-submit:通過程序腳本,提交相關的代碼、依賴等來操作spark作業。
最多見的提交任務的交互方式,簡單易用、參數齊全。
3、spark-sql:通過sql的方式操作spark作業。
sql相關的學習、測試、生產環境研發均可以使用該直接操作交互方式。
4、spark-class:最低層的調用方式,其它調用方式多是最終轉化到該方式中去提交。
直接使用較少
5、sparkR,sparkPython:通過其它非java、scala語言直接操作spark作業的方式。
R、python語言使用者的交互方式。
2.2.1重要交互方式使用介紹
重點說明spark-shell,spark-submit兩大方式,spark-sql後有專門章節介紹,其它小衆方式不做介紹。
1、spark-shell
-
交互方式定位
- 一個強大的交互式數據操作與分析的工具,提供一個簡單的方式快速學習spark相關的API。
-
啓動方式
- 前置環境:已將spark-shell等交互式腳本已加入系統PATH變量,可在任意位置使用。
- 以本地2個線程來模擬運行spark相關操作,該數量一般與本機的cpu核數相一致爲最佳spark-shell --master local[2]
-
相關參數
- 1.參數列表獲取方式:spark-shell --help
- 2.其參數非常多,但由於該方式主要是簡單學習使用,故其參數使用極少,故不做詳解。
-
使用示例介紹
-
交互式入口
-
構建一個scala列表,並輸出
-
通過scala列表,構造一個rdd,並進行基本操作
-
通過本地文本文件構建rdd,並進行基本操作
-
通過hdfs文本文件構建rdd,並進行基本操作
-
對rdd進行字符串過濾操作
-
對rdd進行求最大值操作
-
對輸入進行wodcount計算-無排序
-
對輸入進行wodcount計算-按詞頻降序排列輸出
-
2、spark-submit
- 交互方式定位
- 最常用的通過程序腳本,提交相關的代碼、依賴等來操作spark作業的方式。
- 啓動方式
-
spark-submit提交任務的模板
spark-submit \ --class <main-class> \ --master <master-url> \ --jars jar_list_by_comma \ --conf <key>=<value> \ ... # other options <application-jar> \ [application-arguments]
-
spark-submit 詳細參數說明
-
關於–master取值的特別說明
-