Spark簡介
1.1 Spark的初步認識
Spark是一個用來實現快速而通用的集羣計算的平臺。
首先,我們學習Spark首先要知道Spark的應用場景有哪些。Spark適用於各種各樣原先需要多種不同的分佈式平臺場景,包括批處理,迭代算法,交互式查詢,流處理。
1.2 Spark軟件棧
1.2.1 Spark Core
Spark Core實現了Spark基本功能,包含任務調度、內存管理、錯誤恢復、與存儲系統的交互等模塊。Spark Core中還包含了對彈性分佈式數據集(RDD)的API定義。RDD表示分佈式再多個計算節點上可以並行操作的元素集合,是Spark主要編程抽象。
1.2.2 Spark SQL
Spark SQL是Spark用來操作數據結構化數據的程序包。通過SparkSQL,我們可以使用SQL來查詢數據。同樣,SparkSQL還支持多個數據源,比如:Hive表,Parquet以及JSON等。
1.2.3 Spark Streaming
是Spark提供的對實時數據進行流式計算的組件。且支持與SparkCore同級別的容錯性,吞吐量以及可伸縮性。
1.2.4 MLlib
機器學習(ML)功能的程序庫。提供了很多的機器學習算法,包括分類,迴歸,聚類,協同過濾等,還提供了模型評估,數據導入等額外的支持功能。
1.2.5 Graphx
用來操作圖的程序庫,比如說社交網絡的朋友關係圖。
1.2.6 集羣管理器
Spark設計可以高效的在一個計算節點到數千個計算節點之間伸縮計算。爲了實現這樣的要求,同時獲得最大的靈活性,Spark支持在各種集羣管理器(cluster manager)上運行,包括Hadoop,Yarn,Apache Mesos以及Spark自帶的一個簡易調度器,稱之爲獨立調度器。
Spark內核
2.1 Spark內核概述
Spark內核泛指Spark核心運行機制,包括Spark核心組件的運行機制、Spark任務調度機制、Spark內存管理機制、Spark核心功能的運行原理等,熟悉掌握Spark內核原理,能夠幫助我們更好地完成Spark代碼設計,並能夠幫助我們準確鎖定項目運行過程中出現問題的所在。
2.1.1 Spark核心組件回顧
Driver
從上層來看,每個Spark應用都有一個驅動程序(Driver) 來發起集羣上的各種並行操作。驅動器程序包含應用的main函數,並且定義了集羣的分佈式集羣數據集。負責實際代碼的執行工作。Driver在Spark作業執行時主要負責:
- 將用戶程序轉化爲作業(Job)
- 在Executor之間調度任務(Task)
- 跟蹤Executor的執行情況
- 通過UI展示查詢運行和情況
Executor
Spark Executor節點是負責在Spark作業中運行具體任務,任務彼此之間相互獨立。Spark應用啓動時,Executor節點被同時啓動,並且始終伴隨着整個Spark 應用的生命週期而存在。如果有Executor節點發生了故障或崩潰,Spark 應用也可以繼續執行,會將出錯節點上的任務調度到其他Executor節點上繼續運行。
Executor有兩個核心功能: - 負責運行組成Spark應用的任務,並將結果返回驅動器(DRIVER);
- 他們通過自身的塊管理器(Block Manager)爲用戶程序中要求緩存的RDD提供內存式存儲。RDD是直接緩存在Executor進程內的,因此任務可以再運行時衝零分利用緩存數據加速運算。
2.1.2 Spark通用運行流程概述
不論Spark以任何模式進行部署,都是以如下核心步驟進行工作的:
- 任務提交後,都會啓動Driver程序的;
- 隨後Driver向集羣管理器註冊應用程序;
- 之後集羣管理器根據此任務的配置文件分配Executor並啓動;
- 當Driver所需的資源全部滿足之後,Driver開始執行main函數,Spark查詢爲懶執行,當執行到Action算子時開始反向推算,根據寬依賴進行stage對應一個Taskset,Taskset中有對個Task;
- 根據本地化原則,Task會被分發到指定的Executor去執行,在任務執行的過程中,Executor也會不斷與Driver進行通信,報告任務運行情況。
Spark通信架構
Spark通信架構概述
Spark通訊框架中各個組件(Client/Master/Worker)可以認爲是一個個獨立的實體,各個實體之間通過消息來進行通訊。具體的組件之間的關係圖如下所示:
EndPoint(Client / Mater / Worker)有1個InBox和N個OutBox(N >=1 , N取決於當前EndPoint於多少個其他的EndPoint進行通信 , 一個與其通訊的其他EndPoint對應一個OutBox),EndPoint接收到的消息被寫入InBox,發送出去的消息寫入OutBox並被髮送到其他EndPoint的InBox中。