Spark天堂之门解密
?本課主題
- 什么是 Spark 的天堂之門
- Spark 天堂之門到底在那里
- Spark 天堂之門源碼鑒賞
?
引言
Spark 天堂之門就是SparkContext,這篇文章會從 SparkContext 創建3大核心對象 TaskSchedulerImpl、DAGScheduler 和 SchedulerBackend 開始到注冊給 Master 這個過程中的源碼鑒賞,SparkContext 是整個 Spark 程序通往集群的唯一通道,它是程序起點,也是程序終點,所以把它稱之為天堂之門,看過 Spark HelloWorld 程序的朋友都知道,你在程序的開頭必需先定義SparkContext、接著調用 SparkContext 的方法,比如說 sc.textFile(file),最后也會調用 sc.stop( ) 來退出應用程序。現在我們就來看看 SparkContext 里面到底有什么秘密,以及為什么它會被稱為天堂之門。希望這篇文章能為讀者帶出以下的啟發:
- 了解在 SparkContext 內部創建了哪些實例對象以及如何創建
- 了解真正是哪個實例對象向 Master?注冊以及如何注冊
?
什么是 Spark 的天堂之門
?
Spark 天堂之門到底在那里
運行一個程序,你會看見 SparkContext 從程序開始到結束都有它的身影,SparkContext 是 Spark 應用程序的核心呀!
[下圖是一個 HelloWord 應用程序在 IDEA 中的運行狀況]
?
Spark 天堂之門源碼鑒賞
這次主要是看當提交Spark程序后,在 SparkContext 實例化的過程中,里面會創建多少個核心實例來為應用程序完成注冊,SparkContext 最主要的是實例化?TaskSchedulerImpl。
[下圖是 SparkContext 在創建核心對象后的流程圖]
- DAGScheduler 是面向 Job 的 Stage 的高層調度器;
- TaskScheduler 是一個接口,是低層調度器,根據具體的 ClusterManager 的不同會有不同的實現,Standalone 模式下具體的實現 TaskSchedulerImpl;?
- SchedulerBackend 是一個接口,根據具體的 ClusterManager 的不同會有不同的實現,Standalone 模式下具體的實現是SparkDeploySchedulerBackend
- 負責向Master 連接連接注冊當前程序 RegisterWithMaster
- 接收集群中為當前應用程序而分配的計算資源 Executor 的注冊并管理 Executors;?
- 負責發送 Task 到具體的 Executor 執行
補充說明的是?SparkDeploySchedulerBackend 是被?TaskSchedulerImpl 來管理的!
創建 SparkContext 的核心對象- 程序一開始運行時會實例化 SparkContext 里的東西,所以不在方法里的成員都會被實例化!一開始實例化的時候第一個關鍵的代碼是?createTaskScheduler,它是位于 SparkContext 的 Primary Constructor 中,當它實例化時會直接被調用,這個方法返回的是 taskScheduler 和 dagScheduler 的實例,然后基于這個內容又構建了 DAGScheduler,然后調用?taskScheduler 的 start( ) 方法,要先創建taskScheduler然后再創建 dagScheduler,因為taskScheduler是受dagScheduler管理的。
[下圖是 SparkContext.scala 中的創建 schedulerBackend 和 taskSchdulerImpl 的實例對象] - 調用 createTaskSchedule,這個方法創建了 TaskSchdulerImpl 和 SparkDeploySchedulerBackend,接受第一個參數是 SparkContext 對象本身,然后是字符串,(這也是平時傳入 master 里的字符串)
[下圖是 HelloSpark.scala 中創建 SparkConf 和 SparkContext 的上下文信息]
[下圖是 SparkContext.scala 中的 createTaskScheduler 方法] - 它會判斷一下你的 master 是什么然后具體進行不同的操作!假設我們是Spark 集群模式,它會:
[下圖是 SparkContext.scala 中的 SparkMasterRegex 靜態對象] - 創建 TaskSchedulerImpl 實例然后把 SparkContext 傳進去;?
- 匹配集群中 master 的地址 e.g. spark://?
- 創建 SparkDeploySchedulerBackend 實例,然后把 taskScheduler (這里是 TaskSchedulerImpl)、SparkContext 和 master 地址信息傳進去;
- 調用 taskScheduler (這里是 TaskSchedulerImpl) 的 initialize 方法?最后返回 (SparkDeploySchedulerBackend,?TaskSchedulerImpl) 的實例對象
- SparkDeploySchedulerBackend 是被?TaskSchedulerImpl 來管理的,所以這里要首先把 scheduler 創建,然后把?scheduler 的實例傳進去。
[下圖是 SparkContext.scala 中的調用模式匹配 SPARK_REGEX 的處理邏輯] - Task 默認失敗后重新啟動次數為 4 次
[下圖是 TaskSchedulerImpl.scala 中的類和主構造器的調用方法]
TaskSchedulerImpl.initialize( )方法是
- 創建一個 Pool 來初定義資源分布的模式 Scheduling Mode,默認是 先進先出的?模式。
調用?taskScheduler 的 start( ) 方法
- 在這個方法中再調用 backend (SparkDeploySchedulerBackend) 的 start( ) 方法。
- 當通過 SparkDeploySchedulerBackend 注冊程序給 Master 的時候會把以上的 command 提交給 Master?
- Master 發指令給 Worker 去啟動 Executor 所有的進程的時候加載的 Main 方法所在的入口類就是 command 中的CoarseGrainedExecutorBackend,當然你可以實現自己的 ExecutorBackend,在?CoarseGrainedExecutorBackend 中啟動 Executor (Executor 是先注冊在實例化),Executor 通過線程池并發執行 Task。
- 這里調用了它的 run 方法
- 注冊成功后再實例化
- 然后創建一個很重要的對象,AppClient 對象,然后調用它的 client (AppClient) 的?start( ) 方法,創建一個 ClientEndpoint 對象。
- 它是一個 RpcEndPoint,然后接下來的故事就是向 Master?注冊,首先調用自己的 onStart 方法
- 然后再調用 registerWithMaster 方法
- 從?registerWithMaster 調用 tryRegisterAllMasters,開一條新的線程來注冊,然后發送一條信息(RegisterApplication 的case class )?給 Master,注冊是通過 Thread 來完成的。
ApplicationDescription 的 case class
- Master 收到了這個信息便開始注冊,注冊后最后再次調用 schedule( ) 方法
?
?
總結
SparkContext 開啟了天堂之門:Spark 程序是通過 SparkContext 發布到 Spark集群的SparkContext 導演了天堂世界:Spark 程序運行都是在 SparkContext 為核心的調度器的指揮下進行的:SparkContext 關閉了天堂之門:SparkContext 崩潰或者結束的是偶整個 Spark 程序也結束啦!
?
程序提交整體流程如下圖:
?
?
轉載于:https://www.cnblogs.com/sky-sql/p/9078660.html
總結
以上是生活随笔為你收集整理的Spark天堂之门解密的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iBase4J项目笔记
- 下一篇: 我是如何入门机器学习的呢