關(guān)于 spark context 初始化TaskScheduler和SchedulerBackend(針對外部調(diào)度框架)

case masterUrl =>
  val cm = getClusterManager(masterUrl) match {
    case Some(clusterMgr) => clusterMgr
    case None => throw new SparkException("Could not parse Master URL: '" + master + "'")
  }
  try {
    val scheduler = cm.createTaskScheduler(sc, masterUrl)
    val backend = cm.createSchedulerBackend(sc, masterUrl, scheduler)
    cm.initialize(scheduler, backend)
    (backend, scheduler)
  } catch {
    case se: SparkException => throw se
    case NonFatal(e) =>
      throw new SparkException("External scheduler cannot be instantiated", e)
  }
private def getClusterManager(url: String): Option[ExternalClusterManager] = {
  val loader = Utils.getContextOrSparkClassLoader
  val serviceLoaders =
  ServiceLoader.load(classOf[ExternalClusterManager], loader).asScala.filter(_.canCreate(url))
  if (serviceLoaders.size > 1) {
    throw new SparkException(s"Multiple Cluster Managers ($serviceLoaders) registered " +
        s"for the url $url:")
  }
  serviceLoaders.headOption
}

這邊 是如何將

class YarnClusterManager extends ExternalClusterManager

回答:
通過getClusterManager 方法中的:

ServiceLoader.load(classOf[ExternalClusterManager], loader).asScala.filter(_.canCreate(url))

先加載所有ExternalClusterManager的實(shí)現(xiàn)類,然后根據(jù)方法中的canCreate方法來判斷是哪一個實(shí)現(xiàn)是符合url 的規(guī)制的將這個
實(shí)例對象判斷出來。
比如:

YarnClusterManager 中
override def canCreate(masterURL: String): Boolean = {
  masterURL == "yarn"
}

兩個實(shí)例的創(chuàng)建過程:

val scheduler = cm.createTaskScheduler(sc, masterUrl)
val backend = cm.createSchedulerBackend(sc, masterUrl, scheduler)
cm.initialize(scheduler, backend)
(backend, scheduler)

其中 cm 表示YarnClusterManager(以yarn為例) 所以三個方法的具體實(shí)現(xiàn)如下

override def createTaskScheduler(sc: SparkContext, masterURL: String): TaskScheduler = {
  sc.deployMode match {
    case "cluster" => new YarnClusterScheduler(sc)
    case "client" => new YarnScheduler(sc)
    case _ => throw new SparkException(s"Unknown deploy mode '${sc.deployMode}' for Yarn")
  }
}

override def createSchedulerBackend(sc: SparkContext,
    masterURL: String,
    scheduler: TaskScheduler): SchedulerBackend = {
  sc.deployMode match {
    case "cluster" =>
      new YarnClusterSchedulerBackend(scheduler.asInstanceOf[TaskSchedulerImpl], sc)
    case "client" =>
      new YarnClientSchedulerBackend(scheduler.asInstanceOf[TaskSchedulerImpl], sc)
    case  _ =>
      throw new SparkException(s"Unknown deploy mode '${sc.deployMode}' for Yarn")
  }
}

override def initialize(scheduler: TaskScheduler, backend: SchedulerBackend): Unit = {
  scheduler.asInstanceOf[TaskSchedulerImpl].initialize(backend)
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,933評論 18 139
  • ¥開啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程,因...
    小菜c閱讀 6,523評論 0 17
  • YarnYarn產(chǎn)生背景:Yarn直接來自于MR1.0MR1.0 問題:采用的是master slave結(jié)構(gòu),ma...
    時待吾閱讀 5,874評論 2 23
  • 借用“間隔年”的說法,說一說我自定義的“間隔月”。所謂“間隔月”,就是從上家離職到下家入職之間這一個月的時間。 舍...
    jinglan0379閱讀 260評論 2 4
  • 手機(jī)那頭響起了和以往一樣的聲音,也許是心理作用,他的聲音和以往明朗的聲音不同,今天的聲音帶著淡淡的憂愁。但我沒有想...
    喀喇喀喇閱讀 440評論 0 1