30分鐘理解Spark的基本原理

 

文章發佈於公號【數智物語】 (ID:decision_engine),關注公號不錯過每一篇乾貨。算法

 

 

 

做者 | 梁雲1991編程

轉載自Python與算法之美(ID:Python_Ai_Road)數據結構

 

01Spark優點特色架構

 

做爲大數據計算框架 MapReduce 的繼任者,Spark 具有如下優點特性。框架

 

01高效性機器學習

 

不一樣於 MapReduce 將中間計算結果放入磁盤中,Spark 採用內存存儲中間計算結果,減小了迭代運算的磁盤 IO,並經過並行計算 DAG 圖的優化,減小了不一樣任務之間的依賴,下降了延遲等待時間。內存計算下,Spark 比 MapReduce 快 100 倍。分佈式

 

 

02易用性函數式編程

 

不一樣於 MapReduce 僅支持 Map 和 Reduce 兩種編程算子,Spark 提供了超過 80 種不一樣的 Transformation 和 Action 算子,如map, reduce, filter, groupByKey, sortByKey, foreach 等,而且採用函數式編程風格,實現相同的功能須要的代碼量極大縮小。函數

 

 

03通用性oop

 

Spark 提供了統一的解決方案。Spark 能夠用於批處理、交互式查詢(Spark SQL)、實時流處理(Spark Streaming)、機器學習(Spark MLlib)和圖計算(GraphX)。

 

這些不一樣類型的處理均可以在同一個應用中無縫使用。這對於企業應用來講,就可以使用一個平臺來進行不一樣的工程實現,減小了人力開發和平臺部署成本。

 

 

04兼容性

 

Spark 可以跟不少開源工程兼容使用。如 Spark 可使用 Hadoop 的 YARN 和 Apache Mesos 做爲它的資源管理和調度器,而且 Spark 能夠讀取多種數據源,如 HDFS、HBase、MySQL 等。

 

 

02Spark基本概念

 

RDD:是彈性分佈式數據集(Resilient Distributed Dataset)的簡稱,是分佈式內存的一個抽象概念,提供了一種高度受限的共享內存模型。

 

DAG:是 Directed Acyclic Graph(有向無環圖)的簡稱,反映 RDD 之間的依賴關係。

 

Driver Program:控制程序,負責爲 Application 構建 DAG 圖。

 

Cluster Manager:集羣資源管理中心,負責分配計算資源。

 

Worker Node:工做節點,負責完成具體計算。

 

Executor:是運行在工做節點(Worker Node)上的一個進程,負責運行 Task,併爲應用程序存儲數據。

 

Application:用戶編寫的 Spark 應用程序,一個 Application 包含多個 Job。

 

Job:做業,一個 Job 包含多個 RDD 及做用於相應 RDD 上的各類操做。

 

Stage:階段,是做業的基本調度單位,一個做業會分爲多組任務,每組任務被稱爲「階段」。

 

Task:任務,運行在 Executor 上的工做單元,是 Executor 中的一個線程。

 

總結:Application 由多個 Job 組成,Job 由多個 Stage 組成,Stage 由多個 Task 組成。Stage 是做業調度的基本單位。

 

 

03Spark架構設計

 

Spark 集羣由 Driver, Cluster Manager(Standalone, Yarn 或 Mesos),以及 Worker Node 組成。對於每一個 Spark 應用程序,Worker Node 上存在一個 Executor 進程,Executor 進程中包括多個 Task 線程。

 

 

04Spark運行流程

 

1,Application 首先被 Driver 構建 DAG 圖並分解成 Stage。

 

2,而後 Driver 向 Cluster Manager 申請資源。

 

3,Cluster Manager 向某些 Work Node 發送徵召信號。

 

4,被徵召的 Work Node 啓動 Executor 進程響應徵召,並向 Driver 申請任務。

 

5,Driver 分配 Task 給 Work Node。

 

6,Executor 以 Stage 爲單位執行 Task,期間 Driver 進行監控。

 

7,Driver 收到 Executor 任務完成的信號後向 Cluster Manager 發送註銷信號。

 

8,Cluster Manager 向 Work Node 發送釋放資源信號。

 

9,Work Node 對應 Executor 中止運行。

 

 

 

05Spark部署模式

 

Local:本地運行模式,非分佈式。

 

Standalone:使用 Spark 自帶集羣管理器,部署後只能運行 Spark 任務。

 

Yarn:Haoop 集羣管理器,部署後能夠同時運行 MapReduce,Spark,Storm,Hbase 等各類任務。

 

Mesos:與 Yarn 最大的不一樣是 Mesos 的資源分配是二次的,Mesos 負責分配一次,計算框架能夠選擇接受或者拒絕。

 

 

06RDD數據結構

 

RDD 全稱 Resilient Distributed Dataset,彈性分佈式數據集,它是記錄的只讀分區集合,是 Spark 的基本數據結構。

 

RDD 表明一個不可變、可分區、裏面的元素可並行計算的集合。

 

通常有兩種方式能夠建立 RDD,第一種是讀取文件中的數據生成 RDD,第二種則是經過將內存中的對象並行化獲得 RDD。

 

//經過讀取文件生成RDD
val  rdd = sc.textFile("hdfs://hans/data_warehouse/test/data")

 

//經過將內存中的對象並行化獲得RDD
val num = Array(1,2,3,4,5)
val rdd = sc.parallelize(num)
//或者 val rdd = sc.makeRDD(num)

 

建立 RDD 以後,可使用各類操做對 RDD 進行編程。

 

RDD 的操做有兩種類型,即 Transformation 操做和 Action 操做。轉換操做是從已經存在的 RDD 建立一個新的 RDD,而行動操做是在 RDD 上進行計算後返回結果到 Driver。

 

Transformation 操做都具備 Lazy 特性,即 Spark 不會馬上進行實際的計算,只會記錄執行的軌跡,只有觸發 Action 操做的時候,它纔會根據 DAG 圖真正執行。

 

 

操做肯定了 RDD 之間的依賴關係。

 

RDD 之間的依賴關係有兩種類型,即窄依賴和寬依賴。窄依賴時,父 RDD 的分區和子 RDD 的分區的關係是一對一或者多對一的關係。而寬依賴時,父 RDD 的分區和子 RDD 的分區是一對多或者多對多的關係。

 

寬依賴關係相關的操做通常具備 shuffle 過程,即經過一個 Patitioner 函數將父 RDD 中每一個分區上 key 不一樣的記錄分發到不一樣的子 RDD 分區。

 

 

依賴關係肯定了 DAG 切分紅 Stage 的方式。

 

切割規則:從後往前,遇到寬依賴就切割 Stage。

 

RDD 之間的依賴關係造成一個 DAG 有向無環圖,DAG 會提交給 DAGScheduler,DAGScheduler 會把 DAG 劃分紅相互依賴的多個 stage,劃分 stage 的依據就是 RDD 之間的寬窄依賴。遇到寬依賴就劃分 stage,每一個 stage 包含一個或多個 task 任務。而後將這些 task 以 taskSet 的形式提交給 TaskScheduler 運行。

 

 

07WordCount範例

 

只須要四行代碼就能夠完成 WordCount 詞頻統計。

 

val file = sc.textFile("hello.txt")
val word = file.flatMap(_.split(","))
val wordOne = word.map((_,1))
wordOne.reduceByKey(_+_)

 

 

 

數智物語徵稿啓事0613.png

 

星標我,天天多一點智慧

 

相關文章
相關標籤/搜索