真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Spark是如何實(shí)現(xiàn)資源管理器比如yarn等可插拔的

本篇文章給大家分享的是有關(guān)Spark是如何實(shí)現(xiàn)資源管理器比如yarn等可插拔的,小編覺(jué)得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說(shuō),跟著小編一起來(lái)看看吧。

創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比琿春網(wǎng)站開(kāi)發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式琿春網(wǎng)站制作公司更省心,省錢(qián),快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋琿春地區(qū)。費(fèi)用合理售后完善,10余年實(shí)體公司更值得信賴。

作為Spark源碼閱讀愛(ài)好者,有誰(shuí)想過(guò)Spark是如何實(shí)現(xiàn)資源管理器比如yarn等可插拔的呢?

其實(shí),在這里不得不說(shuō)一下,spark1.6及之前,資源管理器還是不可插拔,代碼是寫(xiě)死在sparkContext類里的,你要想增加一種資源管理器,必須要修改SparkContext的代碼。

spark2.以后開(kāi)始可以實(shí)現(xiàn)資源管理器的熱插拔,主要工具是ServiceLoader。本文就給大家揭示一下。

ServiceLoader與ClassLoader是Java中2個(gè)即相互區(qū)別又相互聯(lián)系的加載器.JVM利用ClassLoader將類載入內(nèi)存,這是一個(gè)類聲明周期的第一步(一個(gè)java類的完整的生命周期會(huì)經(jīng)歷加載、連接、初始化、使用、和卸載五個(gè)階段,當(dāng)然也有在加載或者連接之后沒(méi)有被初始化就直接被使用的情況)。詳情請(qǐng)參閱:詳解Java類的生命周期

那ServiceLoader又是什么呢?ServiceLoader:一個(gè)簡(jiǎn)單的服務(wù)提供者加載設(shè)施。服務(wù) 是一個(gè)熟知的接口和類(通常為抽象類)集合。服務(wù)提供者 是服務(wù)的特定實(shí)現(xiàn)。提供者中的類通常實(shí)現(xiàn)接口,并子類化在服務(wù)本身中定義的子類。服務(wù)提供者可以以擴(kuò)展的形式安裝在 Java 平臺(tái)的實(shí)現(xiàn)中,也就是將 jar 文件放入任意常用的擴(kuò)展目錄中。也可通過(guò)將提供者加入應(yīng)用程序類路徑,或者通過(guò)其他某些特定于平臺(tái)的方式使其可用?!ㄒ粡?qiáng)制要求的是,提供者類必須具有不帶參數(shù)的構(gòu)造方法,以便它們可以在加載中被實(shí)例化。

通過(guò)在資源目錄META-INF/services中放置提供者配置文件 來(lái)標(biāo)識(shí)服務(wù)提供者。文件名稱是服務(wù)類型的完全限定二進(jìn)制名稱。該文件包含一個(gè)具體提供者類的完全限定二進(jìn)制名稱列表,每行一個(gè)。忽略各名稱周圍的空格、制表符和空行。注釋字符為'#'('\u0023', NUMBER SIGN);忽略每行第一個(gè)注釋字符后面的所有字符。文件必須使用 UTF-8 編碼。 

以延遲方式查找和實(shí)例化提供者,也就是說(shuō)根據(jù)需要進(jìn)行。服務(wù)加載器維護(hù)到目前為止已經(jīng)加載的提供者緩存。每次調(diào)用 iterator 方法返回一個(gè)迭代器,它首先按照實(shí)例化順序生成緩存的所有元素,然后以延遲方式查找和實(shí)例化所有剩余的提供者,依次將每個(gè)提供者添加到緩存??梢酝ㄟ^(guò) reload 方法清除緩存。

以上來(lái)源于Java API里的說(shuō)明,也許說(shuō)的很專業(yè),讓我們有點(diǎn)暈頭轉(zhuǎn)向,我們可以簡(jiǎn)單的認(rèn)為:ServiceLoader也像ClassLoader一樣,能裝載類文件,但是使用時(shí)有區(qū)別,具體區(qū)別如下:

(1) ServiceLoader裝載的是一系列有某種共同特征的實(shí)現(xiàn)類,而ClassLoader是個(gè)萬(wàn)能加載器;

(2)ServiceLoader裝載時(shí)需要特殊的配置,使用時(shí)也與ClassLoader有所區(qū)別;

(3)ServiceLoader還實(shí)現(xiàn)了Iterator接口。

[如有錯(cuò)誤或不到的地方敬請(qǐng)指出,互相學(xué)習(xí):)]

鏈接:https://www.cnblogs.com/sparkbj/articles/6208328.html

首先看一下SparkContext內(nèi)部初始化管理器的代碼

//    創(chuàng)建和啟動(dòng)調(diào)度器    val (sched, ts) = SparkContext.createTaskScheduler(this, master, deployMode)    _schedulerBackend = sched    _taskScheduler = ts    _dagScheduler = new DAGScheduler(this)    _heartbeatReceiver.ask[Boolean](TaskSchedulerIsSet)

主要類方法是createTaskScheduler,其中有片段是通過(guò)url來(lái)找到資源管理器的。

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)        }

getClusterManager內(nèi)部實(shí)現(xiàn)了資源管理器的加載。

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 external cluster managers registered for the url $url: $serviceLoaders")    }    serviceLoaders.headOption  }

然后我們可以找到相關(guān)配置了。

Spark是如何實(shí)現(xiàn)資源管理器比如yarn等可插拔的

以上就是Spark是如何實(shí)現(xiàn)資源管理器比如yarn等可插拔的,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見(jiàn)到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


網(wǎng)站欄目:Spark是如何實(shí)現(xiàn)資源管理器比如yarn等可插拔的
文章分享:http://weahome.cn/article/gsjhhg.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部