何煒杰
評審人:韓晶晶 徐江河
1、Spark 簡介
? Spark 是一種用于大規模數據處理的統一計算引擎。它是加州大學伯克利分校AMP 實驗室所開發,后又成為Apache 頂級項目。圍繞著Spark 還推出了Spark SQL、Spark Streaming、MLlib 和GraphX 等組件。
? Spark使用Scala語言實現,它是一種面向對象的函數式編程語言,能夠像操作本地集合對象一樣輕松地操作分布式數據集。
2、 Spark 特點
2.1 運行速度快
Spark在批數據處理和流式數據處理方面,都有很強勁的表現,因為它使用了最先進的DAG(有向無環圖)調度器、查詢優化器和物理執行引擎。
官方數據表明:在邏輯回歸算法中,Spark的處理速度能達到Hadoop的100多倍,這最主要是因為Spark基于內存計算和引入了DAG調度器。
2.2. 易用性好
Spark提供了超過80個高級的算子,這使得構建并行應用程序變得很容易。Spark支持多種語言進行開發,包括Scala、Java、Python等。尤其是用Scala或Python進行開發時,能用簡潔的代碼實現較為復雜的功能。
2.3 通用性強
Spark 提供了一系列的組件,其中Spark Core 提供內存計算框架、Spark SQL用于處理結構化數據、SparkStreaming用于實時流計算、Graphx用于圖處理、MLlib用于機器學習。你能夠在同一個應用程序中,組合使用這些組件,進行一站式處理。
2.4 隨處運行
Spark能運行在Hadoop, Apache Mesos, Kubernetes, standalone或云端。它也能夠連接各種各樣的數據源,例如HDFS、HBase、Hive。
3、Spark 編程模型
3.1 RDD簡介
Spark 提供的最主要的編程模型是彈性分布式數據集RDD(resilient distributed dataset),這是一種不可變的、分區的、可以并行計算的元素集合。你可以通過Hadoop文件系統上的文件或是已經存在的Scala集合來創建一個RDD,也可以通過已有的RDD來構造一個新的RDD。用戶可以在內存中緩存RDD,這樣可以使得它在并行計算中有效地重用。此外,RDD還能自動從節點故障中恢復。
3.2 RDD五大特性
3.2.1 分區列表
? RDD被劃分為很多分區分布到集群的頂點中,每一個分區都會被一個計算任務TASK處理,分區的多少決定了對這個RDD進行并行計算的粒度。
3.2.2 每個分區都有一個計算函數
? Spark的RDD的計算函數是以分區為基本單位的,每個RDD都會實現 compute函數,對具體的分區進行計算。
3.2.3 依賴于其他RDD
? RDD每次轉換都會生成新的RDD,所以RDD之間會有前后依賴關系。正是因為有了前后的依賴關系,所以當有分區的數據丟失時,Spark 可以通過依賴關系對該分區進行重新計算,從而得出丟失的數據。而不必對所有分區都進行重新計算。
3.2.4 鍵值對類型的RDD有一個分區器
? 分區器決定了RDD如何分區,可以傳入相關的參數。
3.2.5 每個分區都有一個優先位置列表
? 在Spark形成任務有向無環圖的時候,會盡可能地把計算分配到靠近數據的位置,以減少數據網絡傳輸。例如Hadoop 分區的首選位置就是HDFS塊所在的節點。
3.3 RDD依賴
3.3.1 窄依賴
? 窄依賴表示每一個父RDD 中的分區最多被子RDD 的一個分區所使用。常見的窄依賴算子有:map、filter、union等。
[圖片上傳失敗...(image-1d29c7-1542849324248)]
<center>圖3-1 RDD窄依賴</center>
3.3.2 寬依賴
? 寬依賴表示子RDD分區依賴于父RDD的所有分區。相對于窄依賴,寬依賴付出的代價要高很多,應該盡量少使用。常見的寬依賴算子有:groupByKey、reduceByKey等。
? [圖片上傳失敗...(image-f87aa7-1542849324248)]
<center>圖3-2 RDD寬依賴</center>
4、Spark 核心原理
4.1 消息通信原理
4.1.1 Spark啟動消息通信
? Spark啟動過程中主要是進行Master和Worker之間的通信,其消息發送關系如圖4-1所示。首先由Worker節點向Master節點發送注冊消息。Master處理完畢后,返回注冊成功或失敗的消息。如果注冊成功,則Worker定時發送心跳信息給Master。
<center>圖4-1 Spark啟動消息通信交互過程</center>
4.1.2 Spark運行時消息通信
? 圖4-2 展示了Spark運行時消息通信交互過程。用戶提交應用程序時,應用程序的SparkContext會向Master發送應用注冊消息,并由Master給該應用分配Executor,Executor啟動后會向SparkContext發送注冊成功消息。接著,TaskScheduler 會向注冊的Executor發送執行消息。Executor接收到任務消息后啟動并運行。最后當所有任務完成時,由Driver處理結果并回收資源。[圖片上傳失敗...(image-7e0dd5-1542849324248)]
<center>圖4-2 Spark運行時消息通信交互過程</center>
4.2 作業執行原理
? Spark的作業調度主要是指:基于RDD的一系列操作構成一個作業,然后在Executor中執行。而對RDD的操作主要分為轉換操作(Transformation)和行動操作(Action)。對于轉換操作的計算是lazy級別的,也就是說它只會記錄轉換關系,并不會立即觸發計算。只有出現了行動操作才會真正觸發計算。在Spark作業中最重要的是DAGScheduler 和 TaskScheduler 兩個調度器。其中DAGScheduler 負責任務的邏輯調度,而TaskScheduler 負責具體任務的調度執行。下面通過圖4-1對Spark的作業和任務調度系統進行具體介紹。
[圖片上傳失敗...(image-1cb0c2-1542849324248)]
<center>圖4-3 Spark的作業和任務調度系統</center>
(1)Spark應用程序進行各種轉換操作,通過行動操作觸發作業運行。作業提交之后根據RDD之間的依賴關系構建DAG圖,DAG圖提交給DAGScheduler 解析。
(2)DAGScheduler把 DAG拆分為互相依賴的調度階段(Stage)。拆分的原則是:根據RDD的依賴是否為寬依賴,當遇到寬依賴就拆分為一個新的調度階段。每個階段包含的任務構成了任務集,DAGScheduler 會把這些任務集提交給TaskScheduler 進行調度。
(3)TaskScheduler 收到任務集后以任務的形式一個個分發到集群Worker節點的Executor中去運行。如果某個任務運行失敗,TaskScheduler 會將其重新提交。如果某個任務運行的很慢,TaskScheduler 會再啟動一個同樣的任務,哪個任務先執行完就用哪個任務的結果。
(4)Worker節點中的Executor收到任務后,以多線程的方式運行,每個線程負責一個任務。
參考文獻
- 郭景瞻 《圖解Spark:核心技術與案例實戰》電子工業出版社 2017-1
- 王家林 , 段智華 《Spark內核機制解析及性能調優》機械工業出版社 2017-1
- spark官網 http://spark.apache.org/