Application
與其它部件關係:
由一個driver進程和多個executor進程組成。
用戶使用Spark-submit提交到spark的整個應用,由一個driver進程和多個executor進程組成。
Cluster Manager
集羣管理器,負責整個spark集羣的調度和資源分配,spark支持可插拔的cluster manager 。當前,集羣管理器共有4種,分別是standalone、Apache Mesos、Hadoop Yarn、Kubernetes。
與其它部件關係:
standalone模式下爲master,yarn模式下爲yarn。
Driver向cluster manager申請資源。
cluster manager向worker發送徵召信號,worker啓動executor響應徵召,並向driver(SparkContext)申請任務。
Driver收到executor任務完成的信號後向cluster manager發送註銷信號,cluster manager再向worker發送釋放資源信號。
Deploy mode
部署模式,在yarn模式下獨有,有yarn client模式和yarn cluster模式。在cluster模式中ApplicationMaster相當於driver,spark把Driver作爲一個ApplicationMaster在yarn中啓動,然後AM創建應用程序,向RM申請資源,啓動executor來運行Task,同時監控運行過程。
差別:
內容區別 | yarn client | yarn cluster |
---|---|---|
driver位置 | 提交任務的節點上 | NodeManager上 |
消耗worker集羣資源 | 否 | 是 |
driver故障能否重啓 | 否 | 是,使用-supervise對Driver進行監控,掛了可重啓 |
運行日誌本地可看 | 是 | 否 |
適用環境 | 測試、調試、交互環境 | 生產環境 |
是否支持shell | 是 | 否 |
ApplicationMaster作用 | 僅負責申請executor | 申請executor同時也運行driver |
Driver
與其它部件關係:
負責運行main方法,初始化SparkContext,是一個特殊的executor進程。
Driver驅動Executor工作,
負責整個作頁的調度,並向Cluster Manager 申請資源完成具體作業。
yarn cluster模式下,driver運行在ApplicationMaster中。
Driver負責運行application的main函數、創建SparkContext、使用DAGScheduler創建任務的有向無環圖、使用SchedulerBackend給Task分配計算資源、使用TaskScheduler發送task到executor。
SparkContext
與其它部件關係:
由driver創建,包含DAGScheduler和TaskSchduler。
與ClusterManager通信,進行資源申請、任務分配和監控。
每個JVM上只允許一個活躍的SparkContext,只有你stop()當前的活躍的sc才能創建一個新的。
SparkConf
spark配置類,配置以鍵值對的形式存儲。
Worker
是計算節點,可以理解爲一臺服務器,一個節點可以同時是worker和master節點。
與其它部件關係:
一定程度上相當於yarn中的nodemanager。
cluster manager向worker申請資源。
Executor
與其它部件關係:
由worker啓動的一個進程,負責運行task,共享變量就是放在這個進程中,不同的application的executor之間相互獨立。
通過線程池併發執行和線程複用的方式,每個線程可以執行一個任務。
Task
與其它部件關係:
spark任務工作的最小單元,被TaskScheduler序列化以後送到executor上,由executor使用線程池執行任務
Stage
每個作業會因爲RDD之間的依賴關係拆分成TaskSet。有Shuffle Map Stage和Result Stage兩種。
寬依賴和窄依賴
與其它部件關係:
寬依賴和窄依賴由DAGScheduler劃分。
窄依賴指的是一個父RDD分區最多被一個子RDD分區使用(獨生子女),寬依賴指的是一個父RDD分區可能被多個子RDD分區使用。寬依賴涉及到shffle,速度較慢。個人理解實際上兩個依賴區分的根本依據是:父RDD分區數據能否在被一次計算後立即銷燬。根據RDD的血統機制,計算的時候不保留中間結果。如果一個RDD只被一個子RDD使用,那麼就可以講很多個這一類的窄依賴串聯起來,在一個計算節點上執行一系列操作,不保留中間結果,速度超快。但是如果一個父RDD分區可能被多個子RDD分區使用,那麼要等全部子分區計算完後才能清除相應的父RDD分區數據,速度慢。
Master
用來提交任務,即執行spark-submit命令所在的節點。
與其它部件關係:
相當於yarn模式下的yarn。
操作相關
算子
spark中的算子分爲轉換(transformation)和行動(action)兩種。
- transformation用於RDD的創建,還提供了很多操作方法(map、filter),使用舊RDD生成新RDD,轉換是延遲的,只有遇到action的時候transformation纔開始真正地執行。
- action是數據執行部分,類似於count、collect等需要數據落地的時候。
共享變量
一個算子如果使用到了某個外部變量,那麼這個變量會被拷貝到每個task中,每個task只能操作自己的那份變量。共享變量的存在,是爲了讓多個task能共享或者操作某個變量。
- 廣播變量(Broadcast Variable)
- 廣播變量是隻讀的,會在每個executor上拷貝一個副本。因此最大作用是減少了變量到各個節點網絡傳輸消耗,減少shffle或者使得0shffle。另外,在sparksql中會自動將小於一定大小的錶轉換爲廣播變量。
- 累加器(Accumulator)
- 累加器則可以讓多個task共同操作一份變量,比如統計總數,全部任務與driver交互壓力比較大。
源碼相關
DAGScheduler
將DAG中的RDD劃分到不同的stage,即TaskSet,拆分依據是是否爲寬依賴,再將TaskSet提交給TaskScheduler執行。另外,DAGSchduler記錄哪些RDD被存入磁盤等物化動作,尋求最優化調度(數據本地性),監控stage,那個stage運行失敗,則重啓。DAGScheduler會從最後一個RDD出發,使用廣度優先遍歷整個依賴樹,劃分stage,即當某個RDD是shuffle的時候,以此爲界限劃分 前後兩個stage。
TaskScheduler
只爲一個SparkContext服務,接收來自DAGScheduler的任務後,發送到worker的executor中運行。某個任務失敗,負責重試。某任務長時間未運行完,啓動新的,誰先完成就結束。
spark通過TaskScheduler向集羣提交任務。
SchedulerBackend
是一個接口,SparkContext使用它與不同的cluster manager 對接。
SparkContext 使用 SchedulerBackend 來與不同資源管理系統對接,並維護着 Executor 的信息,TaskScheduler 向 Executor 提交任務也是通過 SchedulerBackend 來完成的。
RpcEnv
各個組件之間通信的執行環境。
與其它部件關係:
RpcEndpoint和RpcEndpointRef之間通信是通過RpcEnv進行協調的,定義了RPC框架的啓動、停止、關閉等抽象方法。
RpcEndpoint
表示一個個需要通信的個體(如master,worker,driver),主要根據接收的消息來進行對應的處理。一個RpcEndpoint經歷的過程依次是:構建→onStart→receive→onStop。其中onStart在接收任務消息前調用,receive和receiveAndReply分別用來接收另一個RpcEndpoint(也可以是本身)send和ask過來的消息。如果繼承自ThreadSafeRpcEndpoint則表明該Endpoint不允許併發。
RpcEndpointRef
RpcEndpointRef是對遠程RpcEndpoint的一個引用。當我們需要向一個具體的RpcEndpoint發送消息時,一般我們需要獲取到該RpcEndpoint的引用,然後通過該應用發送消息。
yarn中相關框架部件
ResouceManager
ResourceManager負責集羣中所有資源的統一管理和分配,它接收來自各個節點(NodeManager)的資源彙報信息,並把這些信息按照一定的策略分配給各個應用程序。
NodeManager
NodeManager彙報節點的健康狀態以及Container的運行狀態,並領取RM下發的命令例如重新初始化Container,清理Container等
Container
container是yarn中資源的抽象,封裝了CPU和內存。一個container是一個jvm,也就是對應一個executor。
Appliaction Master
每個application都有一個Application Master進程,是Application啓動的第一個容器,負責從ResouceManager種申請資源、在NodeManager上啓動executors、監控和跟蹤應用程序的進程
與其它部件關係:
向ResouceManager申請資源,在每個NodeManager上啓動executors。
相當於driver。
Spark運行流程
- 啓動Driver以後初始化SparkContext
- SparkContext向cluster manager註冊並申請Executor資源
- cluster manager分配executor資源,向worker發送徵召信號,executor發送心跳到cluster manager上,被徵召的Worker啓動executors,executors向Driver反向註冊,向SparkContext申請任務
- SparkContext中的DAGScheduler將DAG圖分解爲Stage,即TaskSet
- DAGScheduler將TaskSet發送給TaskScheduler,TaskScheduler將Task序列化後分配給executor執行
- executor以stage爲單位執行Task
- Driver監控executor運行
- Driver收到executor任務完成的信號後向Cluster Manager發送註銷信號
- cluster manager向worker發送釋放資源信號
https://blog.csdn.net/dufufd/article/details/53200516
https://www.jianshu.com/p/e14a09089444
https://zhuanlan.zhihu.com/p/74037805
https://blog.csdn.net/paicmis/article/details/85228118
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-8KouVJFl-1584975503996)(https://spark.apache.org/docs/latest/img/cluster-overview.png)]
Application
與其它部件關係:
由一個driver進程和多個executor進程組成。
用戶使用Spark-submit提交到spark的整個應用,由一個driver進程和多個executor進程組成。
Cluster Manager
集羣管理器,負責整個spark集羣的調度和資源分配,spark支持可插拔的cluster manager 。當前,集羣管理器共有4種,分別是standalone、Apache Mesos、Hadoop Yarn、Kubernetes。
與其它部件關係:
standalone模式下爲master,yarn模式下爲yarn。
Driver向cluster manager申請資源。
cluster manager向worker發送徵召信號,worker啓動executor響應徵召,並向driver(SparkContext)申請任務。
Driver收到executor任務完成的信號後向cluster manager發送註銷信號,cluster manager再向worker發送釋放資源信號。
Deploy mode
部署模式,在yarn模式下獨有,有yarn client模式和yarn cluster模式。在cluster模式中ApplicationMaster相當於driver,spark把Driver作爲一個ApplicationMaster在yarn中啓動,然後AM創建應用程序,向RM申請資源,啓動executor來運行Task,同時監控運行過程。
差別:
內容區別 | yarn client | yarn cluster |
---|---|---|
driver位置 | 提交任務的節點上 | NodeManager上 |
消耗worker集羣資源 | 否 | 是 |
driver故障能否重啓 | 否 | 是,使用-supervise對Driver進行監控,掛了可重啓 |
運行日誌本地可看 | 是 | 否 |
適用環境 | 測試、調試、交互環境 | 生產環境 |
是否支持shell | 是 | 否 |
ApplicationMaster作用 | 僅負責申請executor | 申請executor同時也運行driver |
Driver
與其它部件關係:
負責運行main方法,初始化SparkContext,是一個特殊的executor進程。
Driver驅動Executor工作,
負責整個作頁的調度,並向Cluster Manager 申請資源完成具體作業。
yarn cluster模式下,driver運行在ApplicationMaster中。
Driver負責運行application的main函數、創建SparkContext、使用DAGScheduler創建任務的有向無環圖、使用SchedulerBackend給Task分配計算資源、使用TaskScheduler發送task到executor。
SparkContext
與其它部件關係:
由driver創建,包含DAGScheduler和TaskSchduler。
與ClusterManager通信,進行資源申請、任務分配和監控。
每個JVM上只允許一個活躍的SparkContext,只有你stop()當前的活躍的sc才能創建一個新的。
SparkConf
spark配置類,配置以鍵值對的形式存儲。
Worker
是計算節點,可以理解爲一臺服務器,一個節點可以同時是worker和master節點。
與其它部件關係:
一定程度上相當於yarn中的nodemanager。
cluster manager向worker申請資源。
Executor
與其它部件關係:
由worker啓動的一個進程,負責運行task,共享變量就是放在這個進程中,不同的application的executor之間相互獨立。
通過線程池併發執行和線程複用的方式,每個線程可以執行一個任務。
Task
與其它部件關係:
spark任務工作的最小單元,被TaskScheduler序列化以後送到executor上,由executor使用線程池執行任務
Stage
每個作業會因爲RDD之間的依賴關係拆分成TaskSet。有Shuffle Map Stage和Result Stage兩種。
寬依賴和窄依賴
與其它部件關係:
寬依賴和窄依賴由DAGScheduler劃分。
窄依賴指的是一個父RDD分區最多被一個子RDD分區使用(獨生子女),寬依賴指的是一個父RDD分區可能被多個子RDD分區使用。寬依賴涉及到shffle,速度較慢。個人理解實際上兩個依賴區分的根本依據是:父RDD分區數據能否在被一次計算後立即銷燬。根據RDD的血統機制,計算的時候不保留中間結果。如果一個RDD只被一個子RDD使用,那麼就可以講很多個這一類的窄依賴串聯起來,在一個計算節點上執行一系列操作,不保留中間結果,速度超快。但是如果一個父RDD分區可能被多個子RDD分區使用,那麼要等全部子分區計算完後才能清除相應的父RDD分區數據,速度慢。
Master
用來提交任務,即執行spark-submit命令所在的節點。
與其它部件關係:
相當於yarn模式下的yarn。
操作相關
算子
spark中的算子分爲轉換(transformation)和行動(action)兩種。
- transformation用於RDD的創建,還提供了很多操作方法(map、filter),使用舊RDD生成新RDD,轉換是延遲的,只有遇到action的時候transformation纔開始真正地執行。
- action是數據執行部分,類似於count、collect等需要數據落地的時候。
共享變量
一個算子如果使用到了某個外部變量,那麼這個變量會被拷貝到每個task中,每個task只能操作自己的那份變量。共享變量的存在,是爲了讓多個task能共享或者操作某個變量。
- 廣播變量(Broadcast Variable)
- 廣播變量是隻讀的,會在每個executor上拷貝一個副本。因此最大作用是減少了變量到各個節點網絡傳輸消耗,減少shffle或者使得0shffle。另外,在sparksql中會自動將小於一定大小的錶轉換爲廣播變量。
- 累加器(Accumulator)
- 累加器則可以讓多個task共同操作一份變量,比如統計總數,全部任務與driver交互壓力比較大。
源碼相關
DAGScheduler
將DAG中的RDD劃分到不同的stage,即TaskSet,拆分依據是是否爲寬依賴,再將TaskSet提交給TaskScheduler執行。另外,DAGSchduler記錄哪些RDD被存入磁盤等物化動作,尋求最優化調度(數據本地性),監控stage,那個stage運行失敗,則重啓。DAGScheduler會從最後一個RDD出發,使用廣度優先遍歷整個依賴樹,劃分stage,即當某個RDD是shuffle的時候,以此爲界限劃分 前後兩個stage。
TaskScheduler
只爲一個SparkContext服務,接收來自DAGScheduler的任務後,發送到worker的executor中運行。某個任務失敗,負責重試。某任務長時間未運行完,啓動新的,誰先完成就結束。
spark通過TaskScheduler向集羣提交任務。
SchedulerBackend
是一個接口,SparkContext使用它與不同的cluster manager 對接。
SparkContext 使用 SchedulerBackend 來與不同資源管理系統對接,並維護着 Executor 的信息,TaskScheduler 向 Executor 提交任務也是通過 SchedulerBackend 來完成的。
RpcEnv
各個組件之間通信的執行環境。
與其它部件關係:
RpcEndpoint和RpcEndpointRef之間通信是通過RpcEnv進行協調的,定義了RPC框架的啓動、停止、關閉等抽象方法。
RpcEndpoint
表示一個個需要通信的個體(如master,worker,driver),主要根據接收的消息來進行對應的處理。一個RpcEndpoint經歷的過程依次是:構建→onStart→receive→onStop。其中onStart在接收任務消息前調用,receive和receiveAndReply分別用來接收另一個RpcEndpoint(也可以是本身)send和ask過來的消息。如果繼承自ThreadSafeRpcEndpoint則表明該Endpoint不允許併發。
RpcEndpointRef
RpcEndpointRef是對遠程RpcEndpoint的一個引用。當我們需要向一個具體的RpcEndpoint發送消息時,一般我們需要獲取到該RpcEndpoint的引用,然後通過該應用發送消息。
yarn中相關框架部件
ResouceManager
ResourceManager負責集羣中所有資源的統一管理和分配,它接收來自各個節點(NodeManager)的資源彙報信息,並把這些信息按照一定的策略分配給各個應用程序。
NodeManager
NodeManager彙報節點的健康狀態以及Container的運行狀態,並領取RM下發的命令例如重新初始化Container,清理Container等
Container
container是yarn中資源的抽象,封裝了CPU和內存。一個container是一個jvm,也就是對應一個executor。
Appliaction Master
每個application都有一個Application Master進程,是Application啓動的第一個容器,負責從ResouceManager種申請資源、在NodeManager上啓動executors、監控和跟蹤應用程序的進程
與其它部件關係:
向ResouceManager申請資源,在每個NodeManager上啓動executors。
相當於driver。
Spark運行流程
- 啓動Driver以後初始化SparkContext
- SparkContext向cluster manager註冊並申請Executor資源
- cluster manager分配executor資源,向worker發送徵召信號,executor發送心跳到cluster manager上,被徵召的Worker啓動executors,executors向Driver反向註冊,向SparkContext申請任務
- SparkContext中的DAGScheduler將DAG圖分解爲Stage,即TaskSet
- DAGScheduler將TaskSet發送給TaskScheduler,TaskScheduler將Task序列化後分配給executor執行
- executor以stage爲單位執行Task
- Driver監控executor運行
- Driver收到executor任務完成的信號後向Cluster Manager發送註銷信號
- cluster manager向worker發送釋放資源信號
https://blog.csdn.net/dufufd/article/details/53200516
https://www.jianshu.com/p/e14a09089444
https://zhuanlan.zhihu.com/p/74037805
https://blog.csdn.net/paicmis/article/details/85228118