Spark Core 學習筆記

何煒杰

評審人:韓晶晶 徐江河

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。

?
avatar

<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收到任務后,以多線程的方式運行,每個線程負責一個任務。

參考文獻

  1. 郭景瞻 《圖解Spark:核心技術與案例實戰》電子工業出版社 2017-1
  2. 王家林 , 段智華 《Spark內核機制解析及性能調優》機械工業出版社 2017-1
  3. spark官網 http://spark.apache.org/
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Apache Spark 是專為大規模數據處理而設計的快速通用的計算引擎。Spark是UC Berkeley AM...
    大佛愛讀書閱讀 2,854評論 0 20
  • 1.1、 分配更多資源 1.1.1、分配哪些資源? Executor的數量 每個Executor所能分配的CPU數...
    miss幸運閱讀 3,209評論 3 15
  • 1、 性能調優 1.1、 分配更多資源 1.1.1、分配哪些資源? Executor的數量 每個Executor所...
    Frank_8942閱讀 4,591評論 2 36
  • Spark是什么 a)是一種通用的大數據計算框架 b)Spark Core離線計算 Spark SQL交互式查詢 ...
    Alukar閱讀 1,839評論 0 19
  • 通過文章“Spark核心概念RDD”我們知道,Spark的核心是根據RDD來實現的,Spark Scheduler...
    尼小摩閱讀 683評論 1 9