Spark Yarn資源調度流程簡析

一、Yarn Cluster模式

簡單說下Spark Yarn cluster模式的資源調度過程。

這種模式用到YarnClusterScheduler和YarnClusterScheduleBackend。前者沒啥特別的和一般的任務調度器類似,主要繼承TaskSchedulerImpl類。

後者是異步消息處理的,主要是申請資源類消息。SparkYarn裏還實現了一個ApplicationMaster和Yarn交互,爲簡化後文用AM代替Spark Yarn的ApplicationMaster。AM中具體申請Yarn資源使用了YarnAllocator類。

AM先啓動用戶進程Driver,然後啓動AM的Endpoint,將AM的Endpoint發送RegisterClusterManager消息給Driver進行註冊(好讓Driver知道到哪找AM)。等待Driver中的YarnClusterScheduleBackend轉發資源申請請求消息。

申請資源時,spark發送RequestExecutors給YarnClusterScheduler,後者通過YarnClusterScheduleBackend來處理,YarnClusterScheduleBackend又轉發給AM來處理這個消息,AM又調用YarnAllocator的方法來申請Yarn資源。

YarnAllocator申請好Container之後,在Container上啓動YarnCoarseGrainedExecutorBackend(CoarseGrainedExecutorBackend的子類,兩者的差別主要是設置Yarn的日誌路徑等),然後這個Container就可以和Driver交互了。

在Yarn Cluster模式下,spark-submit開始真正執行的第一個程序不是--class指定的用戶進程,而是YarnClusterApplication,sparkSubmit做了處理,這點需要留意。

YarnClusterApplication在Spark-Yarn的Client.scala中定義,其實只是Client的一層包裝:

private[spark] class YarnClusterApplication extends SparkApplication {

  override def start(args: Array[String], conf: SparkConf): Unit = {
    // SparkSubmit would use yarn cache to distribute files & jars in yarn mode,
    // so remove them from sparkConf here for yarn mode.
    conf.remove(JARS)
    conf.remove(FILES)

    new Client(new ClientArguments(args), conf, null).run()
  }

}

總結:

1、Spark-submit上傳到Yarn集羣jar包,提交Spark Yarn的ApplicationMaster。

2、ApplicationMaster啓動Driver,Driver裏啓動YarnClusterScheduleBackend。同時ApplicationMaster啓動AMEndpoint,AMEndpoint啓動時首先發送RegisterClusterManager消息給Driver,好讓Driver找到自己。

3、Driver申請資源,消息轉發到AMEndpoint,AMEndpoint調用YarnAllocator類的方法進行Yarn資源申請。

4、資源申請成功後,YarnAllocator在申請的Container上啓動YarnCoarseGrainedExecutorBackend,來和Driver上的YarnClusterScheduleBackend進行交互。

5、Spark On Yarn運行過程中stdout/stderr會重定向到Yarn的日誌文件路徑中。

理解了Yarn、Spark Yarn Cluster的資源調度過程,對於分佈式計算就通了一半了。

二、Yarn Client模式

Client模式和Cluster的最大區別就是Driver是在客戶端運行,而不是在Yarn集羣運行。其他的AM向Driver註冊這些過程還是一致的。

Client是在YarnClientSchedulerBackend中創建並啓動的,Client的功能是向Yarn註冊一個AM。

這裏不細說了。

三、資源調度和Driver-Executor的關係

Spark不管是standalone還是Yarn方式,其Driver-Executor的模式都是一樣的,Driver啓動後等待Executor註冊,然後Driver分配任務到Executor執行,這一套東西是同一個,不同的是資源調度的方式。

standalone方式下,每個節點啓動Worker,Worker向Master註冊,Driver申請資源是向Master申請,申請的資源在Worker上啓動CoarseGrainedExecutorBackend,然後CoarseGrainedExecutorBackend再註冊到Driver上的SchedulerBackend上。

Yarn方式下,Driver在Cluster模式下先通過YarnClusterApplication提交到Yarn,在Yarn上會啓動AM和Driver,然後Driver通過AM向Yarn申請資源,申請的資源會在Yarn集羣上啓動Container,這個Container是直接啓動CoarseGrainedExecutorBackend來向Driver註冊,後面的過程就和standalone下一樣的了。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章