Spark Streaming資源動(dòng)態(tài)申請(qǐng)和動(dòng)態(tài)控制消費(fèi)速率原理剖析

Spark是粗粒度的,即在默認(rèn)情況下會(huì)預(yù)先分配好資源,再進(jìn)行計(jì)算。

好處是資源提前分配好,有計(jì)算任務(wù)時(shí)就直接使用計(jì)算資源,不用再考慮資源分配。

不好的地方是,高峰值和低峰值時(shí)需要的資源是不一樣的。資源如果是針對(duì)高峰值情況下考慮的,那勢(shì)必在低峰值情況下會(huì)有大量的資源浪費(fèi)。

Twitter最近推出了會(huì)秒殺Storm的Heron,非常值得關(guān)注。因?yàn)镠eron能有更好的資源分配、?更低的延遲。Heron在語(yǔ)義上兼容了Storm,即原來(lái)在Storm上開發(fā)的應(yīng)用程序可以馬上在Heron上使用。Storm絕對(duì)要成為歷史了。Heron的主要開發(fā)語(yǔ)言是C++、Java、Python。其API支持Java。

SparkCore的入口SparkContext:

//?Optionally?scale?number?of?executors?dynamically?based?on?workload.?Exposed?for?testing.

val?dynamicAllocationEnabled?=?Utils.isDynamicAllocationEnabled(_conf)

if?(!dynamicAllocationEnabled?&&?_conf.getBoolean("spark.dynamicAllocation.enabled",?false))?{

logWarning("Dynamic?Allocation?and?num?executors?both?set,?thus?dynamic?allocation?disabled.")

}

_executorAllocationManager?=

if?(dynamicAllocationEnabled)?{

Some(new?ExecutorAllocationManager(this,?listenerBus,?_conf))

}?else?{

None

}

已經(jīng)支持資源的動(dòng)態(tài)分配。

Utils.isDynamicAllocationEnabled:

/**

*?Return?whether?dynamic?allocation?is?enabled?in?the?given?conf

*?Dynamic?allocation?and?explicitly?setting?the?number?of?executors?are?inherently

*?incompatible.?In?environments?where?dynamic?allocation?is?turned?on?by?default,

*?the?latter?should?override?the?former?(SPARK-9092).

*/

defisDynamicAllocationEnabled(conf:?SparkConf):?Boolean?=?{

conf.getBoolean("spark.dynamicAllocation.enabled",?false)?&&

conf.getInt("spark.executor.instances",?0)?==?0

}

ExecutorAllocationManager:

...

//?Clock?used?to?schedule?when?executors?should?be?added?and?removed

private?var?clock:?Clock?=?newSystemClock()

...

有個(gè)時(shí)鐘,基于時(shí)鐘的定時(shí)器會(huì)不斷的掃描Executor的情況,每過(guò)一段時(shí)間去看看資源情況。

Master.schedule:

/**

*?Schedule?the?currently?available?resources?among?waiting?apps.?This?method?will?be?called

*?every?time?a?new?app?joins?or?resource?availability?changes.

*/

private?defschedule():?Unit?=?{

if?(state?!=?RecoveryState.ALIVE)?{?return?}

//?Drivers?take?strict?precedence?over?executors

val?shuffledWorkers?=?Random.shuffle(workers)?//?Randomization?helps?balance?drivers

for?(worker?<-?shuffledWorkers?if?worker.state?==?WorkerState.ALIVE)?{

for?(driver?<-?waitingDrivers)?{

if?(worker.memoryFree?>=?driver.desc.mem?&&?worker.coresFree?>=?driver.desc.cores)?{

launchDriver(worker,?driver)

waitingDrivers?-=?driver

}

}

}

startExecutorsOnWorkers()

}

原先默認(rèn)的用于分配資源。

ExecutorAllocaionManager:

//?Polling?loop?interval?(ms)

private?val?intervalMillis:?Long?=?100

...

//?A?timestamp?for?each?executor?of?when?the?executor?should?be?removed,?indexed?by?the?ID

//?This?is?set?when?an?executor?is?no?longer?running?a?task,?or?when?it?first?registers

private?valremoveTimes=?new?mutable.HashMap[String,?Long]

...

//?Clock?used?to?schedule?when?executors?should?be?added?and?removed

private?var?clock:?Clock?=?new?SystemClock()

...

//?Executor?that?handles?the?scheduling?task.

private?val?executor?=

ThreadUtils.newDaemonSingleThreadScheduledExecutor("spark-dynamic-executor-allocation")

...

removeTimes中有Executor的ID。

executor中有定時(shí)器,不斷執(zhí)行schedule。默認(rèn)周期是intervalMillis(100ms)

ExecutorAllocaionManager.start:

/**

*?Register?for?scheduler?callbacks?to?decide?when?to?add?and?remove?executors,?and?start

*?the?scheduling?task.

*/

defstart():?Unit?=?{

listenerBus.addListener(listener)

val?scheduleTask?=?newRunnable()?{

override?def?run():?Unit?=?{

try?{

schedule()

}?catch?{

case?ct:?ControlThrowable?=>

throw?ct

case?t:?Throwable?=>

logWarning(s"Uncaught?exception?in?thread?${Thread.currentThread().getName}",?t)

}

}

}

executor.scheduleAtFixedRate(scheduleTask,?0,intervalMillis,?TimeUnit.MILLISECONDS)

}

ExecutorAllocaionManager.schedule:

/**

*?This?is?called?at?a?fixed?interval?to?regulate?the?number?of?pending?executor?requests

*?and?number?of?executors?running.

*

*?First,?adjust?our?requested?executors?based?on?the?add?time?and?our?current?needs.

*?Then,?if?the?remove?time?for?an?existing?executor?has?expired,?kill?the?executor.

*

*?This?is?factored?out?into?its?own?method?for?testing.

*/

private?defschedule():?Unit?=?synchronized?{

val?now?=?clock.getTimeMillis

updateAndSyncNumExecutorsTarget(now)

removeTimes.retain?{?case?(executorId,?expireTime)?=>

val?expired?=?now?>=?expireTime

if?(expired)?{

initializing?=?false

removeExecutor(executorId)

}

!expired

}

}

這個(gè)內(nèi)部方法會(huì)被周期性的觸發(fā)執(zhí)行。

實(shí)際生產(chǎn)環(huán)境下,動(dòng)態(tài)資源分配可能要自己做好定制。

SparkStreaming的動(dòng)態(tài)調(diào)整的復(fù)雜之處在于,即使在batch duration內(nèi)剛做了調(diào)整,但可能本batch duration馬上就會(huì)過(guò)期。

你可以考慮改變執(zhí)行周期(intervalMills),來(lái)動(dòng)態(tài)調(diào)整。在一個(gè)batchduration中要對(duì)數(shù)據(jù)分片,可以算一下已擁有閑置的core,如果不夠,則可以申請(qǐng)?jiān)黾覧xecutor,從而把任務(wù)分配到新增的Executor。

也可以考量針對(duì)上一個(gè)batchduration的資源需求情況,因?yàn)榉逯党霈F(xiàn)時(shí),往往會(huì)延續(xù)在多個(gè)連續(xù)的batch duration中??剂可弦粋€(gè)batch duration的情況,用某種算法來(lái)動(dòng)態(tài)調(diào)整后續(xù)的batch duration的資源。修改Spark Streaming可以設(shè)計(jì)StreamingContext的新子類。

其實(shí)前面的動(dòng)態(tài)資源分配的定制方式做起來(lái)不容易,可能仍不太合適。

備注:

資料來(lái)源于:DT_大數(shù)據(jù)夢(mèng)工廠(Spark發(fā)行版本定制)

更多私密內(nèi)容,請(qǐng)關(guān)注微信公眾號(hào):DT_Spark

如果您對(duì)大數(shù)據(jù)Spark感興趣,可以免費(fèi)聽由王家林老師每天晚上20:00開設(shè)的Spark永久免費(fèi)公開課,地址YY房間號(hào):68917580

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,182評(píng)論 6 543
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,489評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 178,290評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,776評(píng)論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,510評(píng)論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,866評(píng)論 1 328
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,860評(píng)論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,036評(píng)論 0 290
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,585評(píng)論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,331評(píng)論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,536評(píng)論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,058評(píng)論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,754評(píng)論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,154評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,469評(píng)論 1 295
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,273評(píng)論 3 399
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,505評(píng)論 2 379

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