說明
- Spark生態系統已經發展成爲一個包含多個子項目的集合,其中包含SparkSQL、Spark Streaming、GraphX、MLib、SparkR等子項目,Spark是基於內存計算的大數據並行計算框架。除了擴展了廣泛使用的 MapReduce 計算模型,而且高效地支持更多計算模式,包括交互式查詢和流處理。Spark 適用於各種各樣原先需要多種不同的分佈式平臺的場景,包括批處理、迭代算法、交互式查詢、流處理。通過在一個統一的框架下支持這些不同的計算,Spark 使我們可以簡單而低耗地把各種處理流程整合在一起。
spark生態
- spark現有五個子生態項目,具體功能如下:
Spark Core
- spark內核,實現了 Spark 的基本功能,包含任務調度、內存管理、錯誤恢復、與存儲系統 交互等模塊。Spark Core 中還包含了對彈性分佈式數據集(resilient distributed dataset,簡稱RDD)的 API 定義。
Spark SQL
- 結構化數據處理組件,支持SQL 或者 Apache Hive 版本的 SQL 方言(HQL)來查詢數據。Spark SQL 支持多種數據源,比 如 Hive 表、Parquet 以及 JSON 等。
Spark Streaming
- 流處理組件,提供操作數據流的 API,並且與 Spark Core 中的 RDD API 高度對應。
Spark MLLib
- 機器學習組件,提供包括分類、迴歸、聚類、協同過濾等,還提供了模型評估、數據 導入等額外的支持功能。
Spark Graphx
- 圖計算
spark 架構
整體架構
-
spark 運行架構圖如下,遵從分佈式主從架構,集羣資源控制管理器(Cluster Manager)、多運行作業任務工作節點(Worker Node)、單應用任務控制節點(Driver)和各工作節點負責具體任務的執行進程(Executor)
-
詳細架構流程如下圖:
運行流程
- spark運行流程大概有4步。如下圖
- 構建 Spark Application 的運行環境,啓動 SparkContext,SparkContext 向 Cluster Manager 註冊,並申請運行 Executor 資源。
- Cluster Manager 爲 Executor 分配資源並啓動 Executor 進程,Executor 運行情況將隨着“心跳”發送到 Cluster Manager 。
- SparkContext 構建 DAG 圖,將 DAG 圖分解成多個 Stage,並把每個 Stage 的 TaskSet(任務集)發送給 Task Scheduler (任務調度器)。Executor 向 SparkContext 申請 Task, Task Scheduler 將 Task 發放給 Executor,同時,SparkContext 將應用程序代碼發放給 Executor
- Task 在 Executor 上運行,把執行結果反饋給 Task Scheduler,然後再反饋給 DAG Scheduler。運行完畢後寫入數據,SparkContext 向 ClusterManager 註銷並釋放所有資源。
細節說明
-
DAG
- DAG Scheduler 把一個 Spark 作業轉換成 Stage 的 DAG,根據 RDD 和 Stage 之間的關係找出開銷最小的調度方法,然後把 Stage 以 TaskSet 的形式提交給 Task Scheduler。此外,DAG Scheduler 還處理由於 Shuffle 數據丟失導致的失敗,這有可能需要重新提交運行之前的 Stage。
- DAG Scheduler 決定運行 Task 的理想位置,並把這些信息傳遞給下層的 Task Scheduler。
-
Stages
- 每個 Spark Job 包含一系列 stages
- Stages 按照數據是否需要 shuffle 來劃分(寬依賴)
- Stages 之間的執行是串行的(除非stage 間計算的RDD不同)
- 因爲 Stages 是串行的,所以 shuffle 越少越好
-
Task Scheduler
- 維護所有 TaskSet,當 Executor 向 Driver 發送“心跳”時,Task Scheduler 會根據其資源剩餘情況分配相應的 Task。另外,Task Scheduler 還維護着所有 Task 的運行狀態,重試失敗的 Task。
-
Task
- 每個 stage 包含一系列的 task
- Task 是並行計算的最小單元
- 一個 stage 中的所有 task 執行同一段代碼邏輯,只是基於不同的數據塊
- 一個 task 只能在一個executor中執行,不能是多個
- 一個 stage 輸出的 partition 數量等於這個 stage 執行 task 的數量
-
partition
- Spark 中 partition(分區) 可以理解爲內存中的一個數據集
- 一個 partition 對應一個 task,一個 task 對應 一個 executor 中的一個 slot,一個 slot 對應物理資源是一個線程 thread
- 1 partition = 1 task = 1 slot = 1 thread
總結
- spark是大數據計算引擎中重要組成部分,悠久的發展歷史,奠定很多計算框架的底層邏輯,值得深入學習和研究。