當前位置:
首頁 > 知識 > 8.SparkContext與Application介紹

8.SparkContext與Application介紹

在前面的內容,我們針對於RpcEndpoint啟動以及RpcEndpoint消息處理機制進行了詳細的介紹,在我們的大腦里,基本上可以構建Spark各節點的模樣。接下來的章節將會從Spark如何從業務代碼分解為Spark的任務,並最終調度這些任務進行詳細的介紹。

前面針對於Client啟動過程以及Driver進行了詳細的描述,下面我們根據用戶代碼中的SparkContext這個API類進行解讀,該類Spark用戶代碼執行的基礎,後續我們會陸續介紹,下面針對於SparkContext以及SparkContext運行過程中產生的Application進行介紹。

一、SparkContext創建過程

8.SparkContext與Application介紹

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簡易結構與交互關係

8.SparkContext與Application介紹

  • 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隊列中,在同一調度中進行資源分配,分配過程如下:

8.SparkContext與Application介紹

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

8.SparkContext與Application介紹

(圖解:橙色組件是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:科技優家 |

您可能感興趣

SparkContext 初始化內部原理