一文理解 Spark 基礎概念及工作原理

文章作者:熊峯,騰訊大數據研發工程師。

Spark 是 UC Berkeley AMP Lab 開源的通用分佈式並行計算框架,目前已成爲 Apache 軟件基金會的頂級開源項目。至於爲什麼我們要學習 Spark,可以總結爲下面三點:

1. Spark 相對於 hadoop 的優勢

(1)高性能

Spark 具有 hadoop MR 所有的優點,hadoop MR 每次計算的中間結果都會存儲到 HDFS 的磁盤上,而 Spark 的中間結果可以保存在內存,在內存中進行數據處理。

(2)高容錯

(3)spark 的通用性

spark 是一個通用的大數據計算框架,相對於 hadoop 它提供了更豐富的使用場景。

spark 相對於 hadoop map reduce 兩種操作還提供了更爲豐富的操作,分爲 action(collect,reduce,save…) 和 transformations(map,union,join,filter…), 同時在各節點的通信模型中相對於 hadoop 的 shuffle 操作還有分區,控制中間結果存儲,物化視圖等。

2. spark 生態介紹

Spark 支持多種編程語言,包括 Java、Python、R 和 Scala。在計算資源調度層支持 local 模式,standalone 模式,yarn 模式以及 k8s 等。

同時 spark 有多組件的支持應用場景,在 spark core 的基礎上提供了 spark Streaming,spark SQL,spark Mllib,spark R,GraphX 等組件。

spark Streaming 用於實時流計算,spark SQL 旨在將熟悉的 SQL 數據庫查詢與更復雜的基於算法的分析相結合,GraphX 用於圖計算,spark Mllib 用於機器學習,spark R 用於對 R 語言的數據計算。

spark 支持多種的存儲介質,在存儲層 spark 支持從 hdfs,hive,aws 等讀入和寫出數據,也支持從 hbase,es 等大數據庫中讀入和寫出數據,同時也支持從 mysql,pg 等關係型數據庫中讀入寫出數據,在實時流計算在可以從 flume,kafka 等多種數據源獲取數據並執行流式計算。

在數據格式上 spark 也支持的非常豐富,比如常見的 txt,json,csv 等格式。同時也支持 parquet,orc,avro 等格式,這幾種格式在數據壓縮和海量數據查詢上優勢也較爲明顯。

二、spark 原理及特點

1. spark core

Spark Core 是 Spark 的核心,其包含如下幾個部分:

(1)spark 基礎配置

sparkContext 是 spark 應用程序的入口,spark 應用程序的提交和執行離不開 sparkContext,它隱藏了網絡通信,分佈式部署,消息通信,存儲體系,計算存儲等,開發人員只需要通過 sparkContext 等 api 進行開發即可。

sparkRpc 基於 netty 實現,分爲異步和同步兩種方式。事件總線主要用於 sparkContext 組件間的交換,它屬於監聽者模式,採用異步調用。度量系統主要用於系統的運行監控。

(2)spark 存儲系統

它用於管理 spark 運行中依賴的數據存儲方式和存儲位置,spark 的存儲系統優先考慮在各節點以內存的方式存儲數據,內存不足時將數據寫入磁盤中,這也是 spark 計算性能高的重要原因。

我們可以靈活的控制數據存儲在內存還是磁盤中,同時可以通過遠程網絡調用將結果輸出到遠程存儲中,比如 hdfs,hbase 等。

(3)spark 調度系統

spark 調度系統主要由 DAGScheduler 和 TaskScheduler 組成。

DAGScheduler 主要是把一個 Job 根據 RDD 間的依賴關係,劃分爲多個 Stage,對於劃分後的每個 Stage 都抽象爲一個或多個 Task 組成的任務集,並交給 TaskScheduler 來進行進一步的任務調度。而 TaskScheduler 負責對每個具體的 Task 進行調度。

具體調度算法有 FIFO,FAIR:

2. spark sql

spark sql 提供了基於 sql 的數據處理方法,使得分佈式的數據集處理變的更加簡單,這也是 spark 廣泛使用的重要原因。

目前大數據相關計算引擎一個重要的評價指標就是:是否支持 sql,這樣纔會降低使用者的門檻。spark sql 提供了兩種抽象的數據集合 DataFrame 和 DataSet。

DataFrame 是 spark Sql 對結構化數據的抽象,可以簡單的理解爲 spark 中的表,相比較於 RDD 多了數據的表結構信息 (schema).DataFrame = Data + schema

RDD 是分佈式對象集合,DataFrame 是分佈式 Row 的集合,提供了比 RDD 更豐富的算子,同時提升了數據的執行效率。

DataSet 是數據的分佈式集合 ,它具有 RDD 強類型的優點 和 Spark SQL 優化後執行的優點。DataSet 可以由 jvm 對象構建,然後使用 map,filter,flatmap 等操作函數操作。

3. spark streaming

這個模塊主要是對流數據的處理,支持流數據的可伸縮和容錯處理,可以與 Flume 和 Kafka 等已建立的數據源集成。Spark Streaming 的實現,也使用 RDD 抽象的概念,使得在爲流數據編寫應用程序時更爲方便。

4. spark 特點

(1)spark 計算速度快

spark 將每個任務構建成 DAG 進行計算,內部的計算過程通過彈性式分佈式數據集 RDD 在內存在進行計算,相比於 hadoop 的 mapreduce 效率提升了 100 倍。

(2)易於使用

spark 提供了大量的算子,開發只需調用相關 api 進行實現無法關注底層的實現原理。

通用的大數據解決方案

相較於以前離線任務採用 mapreduce 實現,實時任務採用 storm 實現,目前這些都可以通過 spark 來實現,降低來開發的成本。同時 spark 通過 spark SQL 降低了用戶的學習使用門檻,還提供了機器學習,圖計算引擎等。

**(3)支持多種的資源管理模式
**

學習使用中可以採用 local 模型進行任務的調試,在正式環境中又提供了 standalone,yarn 等模式,方便用戶選擇合適的資源管理模式進行適配。

(4)社區支持

spark 生態圈豐富,迭代更新快,成爲大數據領域必備的計算引擎。

三、spark 運行模式及集羣角色

1. spark 運行模式

SoAhLp

2. spark 集羣角色

下圖是 spark 的集羣角色圖,主要有集羣管理節點 cluster manager,工作節點 worker,執行器 executor,驅動器 driver 和應用程序 application 五部分組成,下面詳細說明每部分的特點。

(1)Cluster Manager

集羣管理器,它存在於 Master 進程中,主要用來對應用程序申請的資源進行管理,根據其部署模式的不同,可以分爲 local,standalone,yarn,mesos 等模式。

(2)worker

worker 是 spark 的工作節點,用於執行任務的提交,主要工作職責有下面四點:

在 yarn 模式下運行 worker 節點一般指的是 NodeManager 節點,standalone 模式下運行一般指的是 slave 節點。

(3)executor

executor 是真正執行計算任務的組件,它是 application 運行在 worker 上的一個進程。這個進程負責 Task 的運行,它能夠將數據保存在內存或磁盤存儲中,也能夠將結果數據返回給 Driver。

(4)Application

application 是 Spark API 編程的應用程序,它包括實現 Driver 功能的代碼和在程序中各個 executor 上要執行的代碼,一個 application 由多個 job 組成。其中應用程序的入口爲用戶所定義的 main 方法。

(5)Driver

驅動器節點,它是一個運行 Application 中 main 函數並創建 SparkContext 的進程。application 通過 Driver 和 Cluster Manager 及 executor 進行通訊。它可以運行在 application 節點上,也可以由 application 提交給 Cluster Manager,再由 Cluster Manager 安排 worker 進行運行。

Driver 節點也負責提交 Job,並將 Job 轉化爲 Task,在各個 Executor 進程間協調 Task 的調度。

**(6)sparkContext
**

sparkContext 是整個 spark 應用程序最關鍵的一個對象,是 Spark 所有功能的主要入口點。核心作用是初始化 spark 應用程序所需要的組件,同時還負責向 master 程序進行註冊等。

3. spark 其它核心概念

(1)RDD

它是 Spark 中最重要的一個概念,是彈性分佈式數據集,是一種容錯的、可以被並行操作的元素集合,是 Spark 對所有數據處理的一種基本抽象。可以通過一系列的算子對 rdd 進行操作,主要分爲 Transformation 和 Action 兩種操作。

(2)DAG

DAG 是一個有向無環圖,在 Spark 中, 使用 DAG 來描述我們的計算邏輯。主要分爲 DAG Scheduler 和 Task Scheduler。

_圖片出自:_https://blog.csdn.net/newchitu/article/details/92796302

(3)DAG Scheduler

DAG Scheduler 是面向 stage 的高層級的調度器,DAG Scheduler 把 DAG 拆分爲多個 Task,每組 Task 都是一個 stage,解析時是以 shuffle 爲邊界進行反向構建的,每當遇見一個 shuffle,spark 就會產生一個新的 stage,接着以 TaskSet 的形式提交給底層的調度器(task scheduler),每個 stage 封裝成一個 TaskSet。DAG Scheduler 需要記錄 RDD 被存入磁盤物化等動作,同時會需要 Task 尋找最優等調度邏輯,以及監控因 shuffle 跨節點輸出導致的失敗。

(4)Task Scheduler

Task Scheduler 負責每一個具體任務的執行。它的主要職責包括

(5)Job

job 是有多個 stage 構建的並行的計算任務,job 是由 spark 的 action 操作來觸發的,在 spark 中一個 job 包含多個 RDD 以及作用在 RDD 的各種操作算子。

(6)stage

DAG Scheduler 會把 DAG 切割成多個相互依賴的 Stage,劃分 Stage 的一個依據是 RDD 間的寬窄依賴。

在對 Job 中的所有操作劃分 Stage 時,一般會按照倒序進行,即從 Action 開始,遇到窄依賴操作,則劃分到同一個執行階段,遇到寬依賴操作,則劃分一個新的執行階段,且新的階段爲之前階段的 parent,然後依次類推遞歸執行。

child Stage 需要等待所有的 parent Stage 執行完之後纔可以執行,這時 Stage 之間根據依賴關係構成了一個大粒度的 DAG。在一個 Stage 內,所有的操作以串行的 Pipeline 的方式,由一組 Task 完成計算。

(7)TaskSet Task

TaskSet 可以理解爲一種任務,對應一個 stage,是 Task 組成的任務集。一個 TaskSet 中的所有 Task 沒有 shuffle 依賴可以並行計算。

Task 是 spark 中最獨立的計算單元,由 Driver Manager 發送到 executer 執行,通常情況一個 task 處理 spark RDD 一個 partition。Task 分爲 ShuffleMapTask 和 ResultTask 兩種,位於最後一個 Stage 的 Task 爲 ResultTask,其他階段的屬於 ShuffleMapTask。

四、spark 作業運行流程

1. spark 作業運行流程

spark 應用程序以進程集合爲單位在分佈式集羣上運行,通過 driver 程序的 main 方法創建 sparkContext 的對象與集羣進行交互。具體運行流程如下:

2. spark RDD 迭代過程

3. yarn 資源管理器介紹

spark 程序一般是運行在集羣上的,spark on yarn 是工作或生產上用的非常多的一種運行模式。

沒有 yarn 模式前,每個分佈式框架都要跑在一個集羣上面,比如說 Hadoop 要跑在一個集羣上,Spark 用集羣的時候跑在 standalone 上。這樣的話整個集羣的資源的利用率低,且管理起來比較麻煩。

yarn 是分佈式資源管理和任務管理管理,主要由 ResourceManager,NodeManager 和 ApplicationMaster 三個模塊組成。

ResourceManager 主要負責集羣的資源管理,監控和分配。對於所有的應用它有絕對的控制權和資源管理權限。

NodeManager 負責節點的維護,執行和監控 task 運行狀況。會通過心跳的方式向 ResourceManager 彙報自己的資源使用情況。

yarn 資源管理器的每個節點都運行着一個 NodeManager,是 ResourceManager 的代理。如果主節點的 ResourceManager 宕機後,會連接 ResourceManager 的備用節點。

ApplicationMaster 負責具體應用程序的調度和資源的協調,它會與 ResourceManager 協商進行資源申請。ResourceManager 以 container 容器的形式將資源分配給 application 進行運行。同時負責任務的啓停。

container 是資源的抽象,它封裝着每個節點上的資源信息 (cpu, 內存,磁盤,網絡等),yarn 將任務分配到 container 上運行,同時該任務只能使用 container 描述的資源,達到各個任務間資源的隔離。

4. spark 程序在 yarn 上執行流程

spark on yarn 分爲兩種模式 yarn-client 模式,和 yarn—cluster 模式,一般線上採用的是 yarn-cluster 模式。

(1)yarn-client 模式

driver 在客戶端本地執行,這種模式可以使得 spark application 和客戶端進行交互,因爲 driver 在客戶端可以通過 webUI 訪問 driver 的狀態。同時 Driver 會與 yarn 集羣中的 Executor 進行大量的通信,會造成客戶機網卡流量的大量增加。

(2)yarn-cluster 模式

Yarn-Cluster 主要用於生產環境中,因爲 Driver 運行在 Yarn 集羣中某一臺 NodeManager 中,每次提交任務的 Driver 所在的機器都是隨機的,不會產生某一臺機器網卡流量激增的現象,缺點是任務提交後不能看到日誌。只能通過 yarn 查看日誌。

下圖是 yarn-cluster 運行模式:

client 向 yarn 提交應用程序,包含 ApplicationMaster 程序、啓動 ApplicationMaster 的命令、需要在 Executor 中運行的程序等。

ApplicationMaster 程序啓動 ApplicationMaster 的命令、需要在 Executor 中運行的程序等。

ApplicationMaster 向 ResourceManager 註冊,這樣用戶可以直接通過 ResourceManage 查看應用程序的運行狀態。

ApplicationMaster 申請到資源(也就是 Container)後,便與對應的 NodeManager 通信,啓動 Task。

Task 向 ApplicationMaster 彙報運行的狀態和進度,以讓 ApplicationMaster 隨時掌握各個任務的運行狀態,從而可以在任務失敗時重新啓動任務。

應用程序運行完成後,ApplicationMaster 向 ResourceManager 申請註銷並關閉自己。

參考文獻:

Spark on Yarn 架構原理: https://blog.csdn.net/lijingjingchn/article/details/85012470

Spark on Yarn 詳解: https://www.cnblogs.com/bigdata1024/p/12116621.html

Spark 任務提交方式和執行流程: https://www.cnblogs.com/frankdeng/p/9301485.html

Spark 容錯機制: https://www.cnblogs.com/cynchanpin/p/7163160.html

spark 之 scheduler: https://mp.weixin.qq.com/s/9g5e5WlmXUyQDXiU6PTGZA?token=1292183487&lang=zh_CN

Spark 工作原理: https://blog.csdn.net/qq_16681169/article/details/82432841

Spark RDD: https://www.cnblogs.com/zlslch/p/5942204.html

Spark 基本概念快速入門: https://www.leonlu.cc/profession/17-spark-terminology/

spark 中 dag 的介紹: https://blog.csdn.net/newchitu/article/details/92796302

spark: https://spark.apache.org/docs/3.0.0-preview/index.html

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/zA0EZWde8GU5Ls4JF-HcEw