[Kafka与Spark集成系列四] Spark运行结构
歡迎支持筆者新作:《深入理解Kafka:核心設計與實踐原理》和《RabbitMQ實戰指南》,同時歡迎關注筆者的微信公眾號:朱小廝的博客。
歡迎跳轉到本文的原文鏈接:https://honeypps.com/mq/kafka-and-spark-integration-4-running-structure/
在分布式環境下,Spark集群采用的是主從架構。如下圖所示,在一個Spark集群中,有一個節點負責中央協調,調度各個分布式工作節點,這個中央協調節點被稱為驅動器(Driver)節點,與之對應的工作節點被稱為執行器(Executor)節點。驅動器節點可以和大量的執行器節點進行通信,它們也都作為獨立的進程運行。驅動器節點和所有的執行器節點一起被稱為一個Spark應用(Application)。
Spark應用通過一個叫做集群管理器(Cluster Manager)的外部服務在集群中的機器上啟動。Spark自帶的集群管理器被稱為獨立集群管理器。Spark也能運行在YARN、Mesos、Kubernetes這類開源集群管理器上。
Spark驅動器節點是執行你程序中的main()方法的進程。它執行用戶編寫的用來創建SparkContext、創建RDD,以及進行RDD的轉換操作和行動操作的代碼。其實,當你啟動spark-shell時,你就啟動了一個Spark驅動程序。驅動程序一旦停止,Spark應用也就結束了。
驅動器程序在Spark應用中有兩個職責:把用戶程序轉為任務以及為執行器節點調度任務。
Spark驅動器程序負責把用戶程序轉為多個物理執行的單元,這些單元也被稱為任務(Task)。任務是Spark中最小的工作單元,用戶程序通常要啟動成百上千的獨立任務。從上層來看,所有的Spark程序都遵循同樣的結構:程序從輸入數據創建一系列RDD,再使用轉換操作派生出新的RDD,最后使用行動操作收集或存儲結果RDD中的數據。Spark程序其實是隱式地創建出了一個由操作組成的邏輯上的有向無環圖(Directed Acyclic Graph,簡稱DAG)。當驅動器程序運行時,它會把這個邏輯圖轉為物理執行計劃。
有了物理執行計劃之后,Spark驅動器程序必須在各執行器進程間協調任務的調度。執行器進程啟動后,會向驅動器進程注冊自己。因此,驅動器進程始終對應用中所有的執行器節點有完整的記錄。每個執行器節點代表一個能夠處理任務和存儲RDD數據的進程。
Spark驅動器程序會根據當前的執行器節點集合,嘗試把所有任務基于數據所在位置分配給合適的執行器進程。當任務執行時,執行器進程會把緩存數據存儲起來,而驅動器進程同樣會跟蹤這些緩存數據的位置,并且利用這些位置信息來調度以后的任務,以盡量減少數據的網絡傳輸。
Spark執行器節點是一種工作進程,負責在Spark作業中運行任務,任務間相互獨立。Spark應用啟動時,執行器節點就被同步啟動,并且始終伴隨著整個Spark應用的生命周期而存在。如果有執行器節點發生了異?;虮罎?#xff0c;Spark應用也可以繼續執行。執行器進程有兩大作用:第一,它們負責運行組成Spark應用的任務,并將結果返回給驅動器進程;第二,它們通過自身的塊管理器(Block Manager)為用戶程序中要求緩存的RDD提供內存式存儲。RDD是直接緩存在執行器進程內的,因此任務可以在運行時充分利用緩存數據加速運算。
Spark依賴于集群管理器來啟動執行器節點,而在某些特殊的情況下,也依賴集群管理器來啟動驅動器節點。集群管理器是Spark中的可插拔式組件,這樣既可選擇Spark自帶的獨立集群管理,也可以選擇前面所提及的YARN、Mesos之類的外部集群管理器。
不論你使用的是哪一種集群管理器,你都可以使用Spark提供的統一腳本spark-submit將你的應用提交到那種集群管理器上。通過不同的配置選項,spark-submit可以連接到相應的集群管理器上,并控制應用所使用的資源數量。在使用某些特定集群管理器時,spark-submit也可以將驅動器節點運行在集群內部(比如一個YARN的工作節點)。但對于其他的集群管理器,驅動器節點只能被運行在本地機器上。
在集群上運行spark應用的詳細過程為:1. 用戶通過spark-submit腳本提交應用。2. spark-submit腳本啟動驅動器程序,調用用戶定義的main()方法。3. 驅動器程序與集群管理器通信,申請資源以啟動執行器節點。4. 集群管理器為驅動器程序啟動執行器節點。5. 驅動器進行執行用戶應用中的操作。根據程序中所定義的對RDD的轉換操作和行動操作,驅動器節點把工作以任務的形式發送到執行器進行。6. 任務在執行器程序中進行計算并保存結果。7. 如果驅動器程序的main()方法退出,或者調用了SparkContext.stop(),驅動器程序會終止執行器進程,并且通過集群管理器釋放資源。
歡迎跳轉到本文的原文鏈接:https://honeypps.com/mq/kafka-and-spark-integration-4-running-structure/
歡迎支持筆者新作:《深入理解Kafka:核心設計與實踐原理》和《RabbitMQ實戰指南》,同時歡迎關注筆者的微信公眾號:朱小廝的博客。
總結
以上是生活随笔為你收集整理的[Kafka与Spark集成系列四] Spark运行结构的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [Kafka与Spark集成系列三] S
- 下一篇: 如何把一个运行完好的Kafka搞崩溃