1. 程式人生 > 其它 >Spark詳解(02) - Spark概述

Spark詳解(02) - Spark概述

Spark詳解(02) - Spark概述

什麼是Spark

Hadoop主要解決,海量資料的儲存和海量資料的分析計算。

Spark是一種基於記憶體的快速、通用、可擴充套件的大資料分析計算引擎

Hadoop與Spark歷史

HadoopYarn框架比Spark框架誕生的晚,所以Spark自己也設計了一套資源排程框架。

Hadoop與Spark框架對比

Spark內建模組

Spark Core實現了Spark的基本功能,包含任務排程、記憶體管理、錯誤恢復、與儲存系統互動等模組。Spark Core中還包含了對彈性分散式資料集(Resilient Distributed DataSet

,簡稱RDD)API定義。

Spark SQLSpark用來操作結構化資料的程式包。通過Spark SQL,我們可以使用 SQL或者Apache Hive版本的HQL來查詢資料。Spark SQL支援多種資料來源,比如Hive表、Parquet以及JSON等。

Spark StreamingSpark提供的對實時資料進行流式計算的元件。提供了用來操作資料流的API,並且與Spark Core中的 RDD API高度對應。

Spark MLlib提供常見的機器學習功能的程式庫。包括分類、迴歸、聚類、協同過濾等,還提供了模型評估、資料 匯入等額外的支援功能。

Spark GraphX主要用於圖形平行計算和圖挖掘系統的元件。

叢集管理器:Spark設計為可以高效地在一個計算節點到數千個計算節點之間伸縮計算。為了實現這樣的要求,同時獲得最大靈活性,Spark支援在各種叢集管理器(Cluster Manager)上執行,包括Hadoop YARNApache Mesos,以及Spark自帶的一個簡易排程器,叫作獨立排程器。

Spark得到了眾多大資料公司的支援,這些公司包括HortonworksIBMIntelClouderaMapRPivotal、百度、阿里、騰訊、京東、攜程、優酷土豆。當前百度的Spark已應用於大搜索、直達號、百度大資料等業務;阿里利用

GraphX構建了大規模的圖計算和圖挖掘系統,實現了很多生產系統的推薦演算法;騰訊Spark叢集達到8000臺的規模,是當前已知的世界上最大的Spark叢集。

Spark特點

1)快:與Hadoop的MapReduce相比,Spark基於記憶體的運算要快100倍以上,基於硬碟的運算也要快10倍以上。Spark實現了高效的DAG執行引擎,可以通過基於記憶體來高效處理資料流。計算的中間結果是存在於記憶體中的。

2)易用:Spark支援Java、Python和Scala的API,還支援超過80種高階演算法,使使用者可以快速構建不同的應用。而且Spark支援互動式的Python和Scala的Shell,可以非常方便地在這些Shell中使用Spark叢集來驗證解決問題的方法。

3)通用:Spark提供了統一的解決方案。Spark可以用於,互動式查詢(Spark SQL)、實時流處理(Spark Streaming)、機器學習(Spark MLlib)和圖計算(GraphX)。這些不同型別的處理都可以在同一個應用中無縫使用。減少了開發和維護的人力成本和部署平臺的物力成本。

4)相容性:Spark可以非常方便地與其他的開源產品進行融合。比如,Spark可以使用Hadoop的YARN和Apache Mesos作為它的資源管理和排程器,並且可以處理所有Hadoop支援的資料,包括HDFS、HBase等。這對於已經部署Hadoop叢集的使用者特別重要,因為不需要做任何資料遷移就可以使用Spark的強大處理能力。

 

 

 

 

Spark執行架構

執行架構

Spark框架的核心是一個計算引擎,整體來說,它採用了標準 master-slave 的結構。

如下圖所示,它展示了一個 Spark執行時的基本結構。圖形中的Driver表示master,負責管理整個叢集中的作業任務排程。圖形中的Executor 則是 slave,負責實際執行任務。

核心元件

Driver和Executor任務的管理者

DriverExecutor是臨時程式,當有具體任務提交到Spark叢集才會開啟的程式。

  • Driver

Spark驅動器節點,用於執行Spark任務中的main方法,負責實際程式碼的執行工作。Driver在Spark作業執行時主要負責:

將使用者程式轉化為作業(job)

在Executor之間排程任務(task)

跟蹤Executor的執行情況

通過UI展示查詢執行情況

實際上,我們無法準確地描述Driver的定義,因為在整個的程式設計過程中沒有看到任何有關Driver的字眼。所以簡單理解,所謂的Driver就是驅使整個應用執行起來的程式,也稱之為Driver類。

  • Executor

Spark Executor是叢集中工作節點(Worker)中的一個JVM程序,負責在 Spark 作業中執行具體任務(Task),任務彼此之間相互獨立。Spark 應用啟動時,Executor節點被同時啟動,並且始終伴隨著整個 Spark 應用的生命週期而存在。如果有Executor節點發生了故障或崩潰,Spark 應用也可以繼續執行,會將出錯節點上的任務排程到其他Executor節點上繼續執行。

Executor有兩個核心功能:

負責執行組成Spark應用的任務,並將結果返回給驅動器程序

它們通過自身的塊管理器(Block Manager)為使用者程式中要求快取的 RDD 提供記憶體式儲存。RDD 是直接快取在Executor程序內的,因此任務可以在執行時充分利用快取資料加速運算。

Master和Worker 叢集資源管理

Spark叢集的獨立部署環境中,不需要依賴其他的資源排程框架,自身就實現了資源排程的功能,所以環境中還有其他兩個核心元件:Master和Worker,這裡的Master是一個程序,主要負責資源的排程和分配,並進行叢集的監控等職責,類似於Yarn環境中的RM, 而Worker呢,也是程序,一個Worker執行在叢集中的一臺伺服器上,由Master分配資源對資料進行並行的處理和計算,類似於Yarn環境中NM。

Master:Spark特有資源排程系統的Leader。掌管著整個叢集的資源資訊,類似於Yarn框架中的ResourceManager。

Worker: Spark特有資源排程系統的Slave,有多個。每個Slave掌管著所在節點的資源資訊,類似於Yarn框架中的NodeManager

MasterWorkerSpark的守護程序、叢集資源管理者,即Spark在特定模式下正常執行所必須的程序。

ApplicationMaster

Hadoop使用者向YARN叢集提交應用程式時,提交程式中應該包含ApplicationMaster,用於向資源排程器申請執行任務的資源容器Container,執行使用者自己的程式任務job,監控整個任務的執行,跟蹤整個任務的狀態,處理任務失敗等異常情況。

說的簡單點就是,ResourceManager(資源)和Driver(計算)之間的解耦合靠的就是ApplicationMaster。

核心概念

Executor與Core(核)

Spark Executor是叢集中執行在工作節點(Worker)中的一個JVM程序,是整個叢集中的專門用於計算的節點。在提交應用中,可以提供引數指定計算節點的個數,以及對應的資源。這裡的資源一般指的是工作節點Executor的記憶體大小和使用的虛擬CPU核(Core)數量。

應用程式相關啟動引數如下:

名稱

說明

--num-executors

配置Executor的數量

--executor-memory

配置每個Executor的記憶體大小

--executor-cores

配置每個Executor的虛擬CPU core數量

並行度(Parallelism)

在分散式計算框架中一般都是多個任務同時執行,由於任務分佈在不同的計算節點進行計算,所以能夠真正地實現多工並行執行,記住,這裡是並行,而不是併發。這裡將整個叢集並行執行任務的數量稱之為並行度。那麼一個作業到底並行度是多少呢?這個取決於框架的預設配置。應用程式也可以在執行過程中動態修改。

有向無環圖(DAG)

大資料計算引擎框架我們根據使用方式的不同一般會分為四類,其中第一類就是Hadoop所承載的MapReduce,它將計算分為兩個階段,分別為 Map階段 和 Reduce階段。對於上層應用來說,就不得不想方設法去拆分演算法,甚至於不得不在上層應用實現多個 Job 的串聯,以完成一個完整的演算法,例如迭代計算。 由於這樣的弊端,催生了支援 DAG 框架的產生。因此,支援 DAG 的框架被劃分為第二代計算引擎。如 Tez 以及更上層的 Oozie。這裡我們不去細究各種 DAG 實現之間的區別,不過對於當時的 Tez 和 Oozie 來說,大多還是批處理的任務。接下來就是以 Spark 為代表的第三代的計算引擎。第三代計算引擎的特點主要是 Job 內部的 DAG 支援(不跨越 Job),以及實時計算。

這裡所謂的有向無環圖,並不是真正意義的圖形,而是由Spark程式直接對映成的資料流的高階抽象模型。簡單理解就是將整個程式計算的執行過程用圖形表示出來,這樣更直觀,更便於理解,可以用於表示程式的拓撲結構。

DAG(Directed Acyclic Graph)有向無環圖是由點和線組成的拓撲圖形,該圖形具有方向,不會閉環。

提交流程

所謂的提交流程,其實就是開發人員根據需求寫的應用程式通過Spark客戶端提交給Spark執行環境執行計算的流程。在不同的部署環境中,這個提交過程基本相同,但是又有細微的區別,這裡不進行詳細的比較,但是因為國內工作中,將Spark引用部署到Yarn環境中會更多一些,所以本文的提交流程是基於Yarn環境的。

Spark應用程式提交到Yarn環境中執行的時候,一般會有兩種部署執行的方式:Client和Cluster。兩種模式主要區別在於:Driver程式的執行節點位置。

Yarn Client模式

Client模式將用於監控和排程的Driver模組在客戶端執行,而不是在Yarn中,所以一般用於測試。

Driver在任務提交的本地機器上執行

Driver啟動後會和ResourceManager通訊申請啟動ApplicationMaster

ResourceManager分配container,在合適的NodeManager上啟動ApplicationMaster,負責向ResourceManager申請Executor記憶體

ResourceManager接到ApplicationMaster的資源申請後會分配container,然後ApplicationMaster在資源分配指定的NodeManager上啟動Executor程序

Executor程序啟動後會向Driver反向註冊,Executor全部註冊完成後Driver開始執行main函式

之後執行到Action運算元時,觸發一個Job,並根據寬依賴開始劃分stage,每個stage生成對應的TaskSet,之後將task分發到各個Executor上執行。

Yarn Cluster模式

Cluster模式將用於監控和排程的Driver模組啟動在Yarn叢集資源中執行。一般應用於實際生產環境。

在YARN Cluster模式下,任務提交後會和ResourceManager通訊申請啟動ApplicationMaster,

隨後ResourceManager分配container,在合適的NodeManager上啟動ApplicationMaster,此時的ApplicationMaster就是Driver。

Driver啟動後向ResourceManager申請Executor記憶體,ResourceManager接到ApplicationMaster的資源申請後會分配container,然後在合適的NodeManager上啟動Executor程序

Executor程序啟動後會向Driver反向註冊,Executor全部註冊完成後Driver開始執行main函式,

之後執行到Action運算元時,觸發一個Job,並根據寬依賴開始劃分stage,每個stage生成對應的TaskSet,之後將task分發到各個Executor上執行。