30分鐘理解Spark的基本原理

30分鐘理解Spark的基本原理

30分鐘理解Spark的基本原理

30分鐘理解Spark的基本原理

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

作者 | 梁雲1991

轉載自Python與算法之美(ID:Python_Ai_Road)

30分鐘理解Spark的基本原理

01

Spark優勢特點

作為大數據計算框架 MapReduce 的繼任者,Spark 具備以下優勢特性。

01

高效性

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


30分鐘理解Spark的基本原理


02

易用性

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


30分鐘理解Spark的基本原理


03

通用性

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

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


30分鐘理解Spark的基本原理


04

兼容性

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

30分鐘理解Spark的基本原理

02

Spark基本概念

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 是作業調度的基本單位。


30分鐘理解Spark的基本原理


03

Spark架構設計

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


30分鐘理解Spark的基本原理


04

Spark運行流程

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 停止運行。


30分鐘理解Spark的基本原理



30分鐘理解Spark的基本原理


05

Spark部署模式

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

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

Yarn:Haoop 集群管理器,部署後可以同時運行 MapReduce,Spark,Storm,Hbase 等各種任務。

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


30分鐘理解Spark的基本原理


06

RDD數據結構

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 圖真正執行。


30分鐘理解Spark的基本原理


操作確定了 RDD 之間的依賴關係。

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

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


30分鐘理解Spark的基本原理


依賴關係確定了 DAG 切分成 Stage 的方式。

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

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


30分鐘理解Spark的基本原理


07

WordCount範例

只需要四行代碼就可以完成 WordCount 詞頻統計。

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


30分鐘理解Spark的基本原理



30分鐘理解Spark的基本原理



30分鐘理解Spark的基本原理


星標我,每天多一點智慧

30分鐘理解Spark的基本原理


分享到:


相關文章: