Spark設計理念與基本架構


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。
    • 在不同運行模式中任務調度器具體為:
    1. Spark on Standalone模式為TaskScheduler
    2. Yarn-Client模式為YarnClientClusterScheduler
    3. 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM