8.SparkContext與Application介紹
知識
05-28
在前面的內容,我們針對於RpcEndpoint啟動以及RpcEndpoint消息處理機制進行了詳細的介紹,在我們的大腦里,基本上可以構建Spark各節點的模樣。接下來的章節將會從Spark如何從業務代碼分解為Spark的任務,並最終調度這些任務進行詳細的介紹。
前面針對於Client啟動過程以及Driver進行了詳細的描述,下面我們根據用戶代碼中的SparkContext這個API類進行解讀,該類Spark用戶代碼執行的基礎,後續我們會陸續介紹,下面針對於SparkContext以及SparkContext運行過程中產生的Application進行介紹。
一、SparkContext創建過程
SparkContext在新建時
- 內部創建一個SparkEnv,SparkEnv內部創建一個RpcEnv
-
- RpcEnv內部創建並註冊一個MapOutputTrackerMasterEndpoint(該Endpoint暫不介紹)
- 接著創建DAGScheduler,TaskSchedulerImpl,SchedulerBackend
-
- TaskSchedulerImpl創建時創建SchedulableBuilder,SchedulableBuilder根據類型分為FIFOSchedulableBuilder,FairSchedulableBuilder兩類
- 最後啟動TaskSchedulerImpl,TaskSchedulerImpl啟動SchedulerBackend
-
- SchedulerBackend啟動時創建ApplicationDescription,DriverEndpoint, StandloneAppClient
- StandloneAppClient內部包括一個ClientEndpoint
二、SparkContext簡易結構與交互關係
- SparkContext:是用戶Spark執行任務的上下文,用戶程序內部使用Spark提供的Api直接或間接創建一個SparkContext
- SparkEnv:用戶執行的環境信息,包括通信相關的端點
- RpcEnv:SparkContext中遠程通信環境
- ApplicationDescription:應用程序描述信息,主要包含appName, maxCores, memoryPerExecutorMB, coresPerExecutor, Command(
CoarseGrainedExecutorBackend), appUiUrl等 - ClientEndpoint:客戶端端點,啟動後向Master發起註冊RegisterApplication請求
- Master:接受RegisterApplication請求後,進行Worker資源分配,並向分配的資源發起LaunchExecutor指令
- Worker:接受LaunchExecutor指令後,運行ExecutorRunner
- ExecutorRunner:運行applicationDescription的Command命令,最終Executor,同時向DriverEndpoint註冊Executor信息
三、Master對Application資源分配
當Master接受Driver的RegisterApplication請求後,放入waitingDrivers隊列中,在同一調度中進行資源分配,分配過程如下:
waitingApps與aliveWorkers進行資源匹配
- 如果waitingApp配置了app.desc.coresPerExecutor:
-
- 輪詢所有有效可分配的worker,每次分配一個executor,executor的核數為minCoresPerExecutor(app.desc.coresPerExecutor),直到不存在有效可分配資源或者app依賴的資源已全部被分配
- 如果waitingApp沒有配置app.desc.coresPerExecutor:
-
- 輪詢所有有效可分配的worker,每個worker分配一個executor,executor的核數為從minCoresPerExecutor(為固定值1)開始遞增,直到不存在有效可分配資源或者app依賴的資源已全部被分配
- 其中有效可分配worker定義為滿足一次資源分配的worker:
-
- cores滿足:usableWorkers(pos).coresFree - assignedCores(pos) >= minCoresPerExecutor,
- memory滿足(如果是新的Executor):usableWorkers(pos).memoryFree - assignedExecutors(pos) * memoryPerExecutor >= memoryPerExecutor
- 注意:Master針對於applicationInfo進行資源分配時,只有存在有效可用的資源就直接分配,而分配剩餘的app.coresLeft則等下一次再進行分配
四、Worker創建Executor
(圖解:橙色組件是Endpoint組件)
Worker啟動Executor
- 在Worker的tempDir下面創建application以及executor的目錄,並chmod700操作許可權
- 創建並啟動ExecutorRunner進行Executor的創建
- 向master發送Executor的狀態情況
ExecutorRnner
- 新線程【ExecutorRunner for [executorId]】讀取ApplicationDescription將其中Command轉化為本地的Command命令
- 調用Command並將日誌輸出至executor目錄下的stdout,stderr日誌文件中,Command對應的java類為CoarseGrainedExecutorBackend
CoarseGrainedExecutorBackend
- 創建一個SparkEnv,創建ExecutorEndpoint(CoarseGrainedExecutorBackend),以及WorkerWatcher
- ExecutorEndpoint創建並啟動後,向DriverEndpoint發送RegisterExecutor請求並等待返回
- DriverEndpoint處理RegisterExecutor請求,返回ExecutorEndpointRegister的結果
- 如果註冊成功,ExecutorEndpoint內部再創建Executor的處理對象
至此,Spark運行任務的容器框架就搭建完成


※「2017-05-25」WebForm母版頁
※java函數式編程Lambda表達式的示例(一)
※一個Monad的不嚴謹介紹
TAG:科技優家 |
您可能感興趣