1.基本概念
Spark中的一些概念:
- RDD(resillient distributed dataset):彈性分布式數據集。
- Partition:數據分區。即一個RDD的數據可以划分為多少個分區。
- NarrowDependency:窄依賴,即子RDD依賴於父RDD中固定的Partition。Narrow-Dependency分為OneToOneDependency和RangeDependency兩種。
- ShuffleDependency:shuffle依賴,也稱為寬依賴,即子RDD對父RDD中的所有Partition都有依賴。
- Task:是送到某個Executor上的工作單元,即具體執行任務。Task分為ShuffleMapTask和ResultTask兩種。ShuffleMapTask和ResultTask分別類似於Hadoop中的Map和Reduce。Task是運行Application的基本單位,多個Task組成一個Stage,而Task的調度和管理等是由TaskScheduler負責的。
- Job:用戶提交的作業。一個Job包含多個Task組成的並行計算,往往由Spark Action觸發。
- Stage:每個Job會被拆分成多組Task,作為一個TaskSet,其名稱為Stage,Stage的划分和調度是有DAGScheduler來負責的,Stage有非最終的Stage(Shuffle Map Stage)和最終的Stage(Result Stage) 兩種,Stage的邊界就是發生shuffle的地方。一個Job可能被划分為一到多個Stage。
- DAG(directed acycle graph):有向無環圖。用於反映各RDD之間的依賴關系。
- DAGScheduler:根據Job構建基於Stage的DAG(Directed Acyclic Graph有向無環圖),並提交Stage給TaskScheduler。其划分Stage的依賴依據是根據RDD之間的依賴關系找出開銷最小的調度方法。
- TaskScheduler:將TaskSet(即Stage)提交給worker運行,每個Executor運行什么Task就是在此處分配的。TaskScheduler維護所有TaskSet,當Executor向Driver發送心跳時,TaskScheduler會根據資源剩余情況分配相應的Task。另外TaskScheduler還維護所有Task的運行標簽,重試失敗的Task。
- 在不同運行模式中任務調度器具體為:
- Spark on Standalone模式為TaskScheduler
- Yarn-Client模式為YarnClientClusterScheduler
- Yarn-Cluster模式為YarnClusterScheduler
- 將這些術語串起來的運行層次圖如下:
注意:一個Job=多個Stage,一個Stage=多個同種Task
2. Spark模塊設計
整個Spark主要由以下模塊組成:
- Spark Core:Spark的核心功能實現,包括:SparkContext的初始化(Driver Application通過SparkContext提交)、部署模式、存儲體系、任務提交與執行、計算引擎等。
- Spark SQL:提交SQL處理能力,便於熟悉關系型數據庫操作的工程師進行交互查詢。此外,還為熟悉Hadoop的用戶提交Hive SQL處理能力。
- Spark Streaming:提供流式計算處理能力,目前支持Kafka、Flume、Twitter、MQTT、ZeroMQ、Kinesis和簡單的TCP套接字等數據源。此外,還提供窗口操作。
- GraphX:提供圖計算處理能力,支持分布式,Pregel提供的API可以解決圖計算中的常見問題。
- MLlib:提供機器學習相關的統計、分類、回歸等領域的多種算法實現。其一致的API接口大大降低了用戶的學習成本。
Spark SQL、Spark Streaming、GraphX、MLlib的能力都是建立在核心引擎之上,如圖:
2.1 Spark核心功能
Spark Core提供Spark最基礎與最核心的功能,主要包括以下功能。
- SparkContext:通常而言,DriverApplication的執行與輸出都是通過SparkContext來完成的,在正式提交Application之前,首先需要初始化SparkContext。SparkContext隱藏了網絡通信、分布式部署、消息通信、存儲能力、計算能力、緩存、測量系統、文件服務、Web服務等內容,應用程序開發者只需要使用SparkContext提供的API完成功能開發。SparkContext內置的DAGScheduler負責創建Job,將DAG中的RDD划分到不同的Stage,提交Stage等功能。內置的TaskScheduler負責資源的申請、任務的提交及請求集群對任務的調度等工作。
- 存儲體系:Spark優先考慮使用各節點的內存作為存儲,當內存不足時才會考慮使用磁盤,這極大地減少了磁盤I/O,提升了任務執行的效率,使得Spark適用於實時計算、流式計算等場景。此外,Spark還提供了以內存為中心的高容錯的分布式文件系統Tachyou供用戶進行選擇。Tachyon能夠為Spark提供可靠的內存級的文件共享服務。
- 計算引擎:計算引擎由SparkContext中的DAGScheduler、RDD以及具體節點上的Executor負責執行的Map和Reduce任務組成。DAGScheduler和RDD雖然位於SparkContext內部,但是在任務正式提交與執行之前會將Job中的RDD組織成有向無環圖(簡稱DAG),並對Stage進行划分,決定了任務執行階段任務的數量、迭代計算、shuffle等過程。
- 部署模式:由於單節點不足以提供足夠的存儲及計算能力,所以作為大數據處理的Spark在SparkContext的TaskScheduler組件中提供了對Standalone部署模式的實現和Yarn、Mesos、Kubernetes等分布式資源管理系統的支持。通過使用Standalone、Yarn、Mesos、Kubernetes等部署模式為Task分配計算資源,提高任務的並發執行效率。除了可用於實際生產環境的Standalone、Yarn、Mesos、Kubernetes等部署模式外,Spark還提供了Local模式和local-cluster模式便於開發和調試。
2.2 Spark擴展功能
為了擴大應用范圍,Spark陸續增加了一些擴展功能,主要包括:
- Spark SQL:SQL具有普及率高、學習成本低等特點,為了擴大Spark的應用面,增加了對SQL及Hive的支持。Spark SQL的過程可以總結為:首先使用SQL語句解析器(SqlParser)將SQL轉換為語法樹(Tree),並且使用規則執行器(RuleExecutor)將一系列規則(Rule)應用到語法樹,最終生成物理執行計划並執行。其中,規則執行器包括語法分析器(Analyzer)和優化器(Optimizer)。Hive的執行過程與SQL類似。
- Spark Streaming:Spark Streaming與Apache Storm類似,也用於流式計算。Spark Streaming支持Kafka、Flume、Twitter、MQTT、ZeroMQ、Kinesis和簡單的TCP套接字等多種數據輸入源。輸入流接收器(Receiver)負責接入數據,是接入數據流的接口規范。Dstream是Spark Streaming中所有數據流的抽象, DStream可以被組織為DStream Graph。DStream本質上由一系列連續的RDD組成。
- GraphX:Spark提供的分布式圖計算框架。GraphX主要遵循整體同步並行(bulk synchronous parallell, BSP)計算模式下的Pregel模型實現。GraphX提供了對圖的抽象Graph,Graph由頂點(Vertex)、邊(Edge)及繼承了Edge的EdgeTriplet(添加了srcAttr和dstAttr用來保存源頂點和目的頂點的屬性)三種結構組成。GraphX目前已經封裝了最短路徑、網頁排名、連接組件、三角關系統計等算法的實現,用戶可以選擇使用。
- MLlib:Spark提供的機器學習框架。機器學習是一門涉及概率論、統計學、逼近論、凸分析、算法復雜度理論等多領域的交叉學科。MLlib目前已經提供了基礎統計、分類、回歸、決策樹、隨機森林、朴素貝葉斯、保序回歸、協同過濾、聚類、維數縮減、特征提取與轉型、頻繁模式挖掘、預言模型標記語言、管道等多種數理統計、概率論、數據挖掘方面的數學算法。
3. Spark 模型設計
3.1 Spark編程模型
Spark應用程序從編寫到提交、執行、輸出的整個過程如圖所示,圖中描述的步驟如下:
1) 用戶使用SparkContext提供的API(常用的有textFile、sequenceFile、runJob、stop等)編寫Driver application程序。此外SQLContext、HiveContext及StreamingContext對SparkContext進行封裝,並提供了SQL、Hive及流式計算相關的API。
2) 使用SparkContext提交的用戶應用程序,首先會使用BlockManager和BroadcaseManager將任務的Hadoop配置進行廣播。然后由DAGScheduler將任務轉換為RDD並組織成DAG,DAG還將被划分為不同的Stage,一個Stage會由多個Task組成,多個Task將會被存放在TaskSet集合里,TaskSet即為Stage。最后由TaskScheduler將Task借助Netty通信框架將任務提交給集群管理器(Cluster Manager)。
3) 集群管理器(Cluster Manager)給任務分配資源,即將具體任務分配到Worker上,Worker創建Executor來處理任務的運行。Standalone、YARN、Mesos、Kubernetes、EC2等都可以作為Spark的集群管理器。
3.2 RDD計算模型
RDD可以看做是對各種數據計算模型的統一抽象,Spark的計算過程主要是RDD的迭代計算過程,如圖所示。RDD的迭代計算過程非常類似與管道。分區數量取決於partition數量的設定,每個分區的數據只會在一個Task中計算。所有分區可以在多個機器節點的Executor上並行執行。
4. Spark基本架構
從集群部署的角度來看,Spark集群由以下部分組成:
- Cluster Manager:Spark的集群管理器,主要負責資源的分配與管理。集群管理器分配的資源屬於一級分配,它將各個Worker上的內存、CPU等資源分配給應用程序,但是並不負責對Execoutor的資源分配。目前,Standalone、YARN、Mesos、Kubernetes、EC2等都可以作為Spark的集群管理器。
- Worker:Spark的工作節點、從節點。對Spark應用程序來說,由集群管理器分配得到資源的Worker節點主要負責以下工作:控制計算節點,創建並啟動Executor,將資源和任務進一步分配給Executor,同步資源信息給Cluster Manager。
- Executor:是為某個Appliation運行再Worker node上的一個進程,主要負責任務的執行以及與Worker、Driver App的信息同步。
- Driver App:客戶端驅動程序,也可以理解為客戶端應用程序,運行Application的main()函數,用於將任務程序轉換為RDD和DAG,並與Cluster Manager進行通信與調度。
這些組成部分之間的整體關系如圖所示:
參考資料:
《深入理解Spark核心思想與源碼分析》
https://blog.csdn.net/swing2008/article/details/60869183