Spark 調(diào)度系統(tǒng)的工作流程包含如下 5 個(gè)步驟:
- 將 DAG 拆分為不同的運(yùn)行階段 Stages罕袋;
- 創(chuàng)建分布式任務(wù) Tasks 和任務(wù)組 TaskSet;
- 獲取集群內(nèi)可用的硬件資源情況哈街;
- 按照調(diào)度規(guī)則決定優(yōu)先調(diào)度哪些任務(wù) / 組;
依序?qū)⒎植际饺蝿?wù)分發(fā)到執(zhí)行器 Executor。
調(diào)度系統(tǒng)中的核心組件有哪些废睦?
1. DAGScheduler(需求端,創(chuàng)建的tasks就是需求)
職責(zé)
1.把用戶 DAG 拆分為 Stages;
2.在 Stage 內(nèi)創(chuàng)建計(jì)算任務(wù) Tasks2. SchedulerBackend(資源供給端,Executors資源情況)
職責(zé):
資源調(diào)度器的封裝與抽象(SchedulerBackend是資源調(diào)度的接口,對(duì)接不同資源調(diào)度模式需要不同的資源調(diào)度實(shí)現(xiàn))
不同資源調(diào)度模式對(duì)應(yīng)的實(shí)現(xiàn)類(lèi)(local,Standalone,yarn-cluster,yarn-client等)CoarseGrainedSchedulerBackend 是SchedulerBackend 的一個(gè)粗粒度資源調(diào)度實(shí)現(xiàn)
對(duì)內(nèi)(Executors資源情況)
SchedulerBackend 用 ExecutorData 對(duì) Executor 進(jìn)行資源畫(huà)像养泡;
用一個(gè)叫做 ExecutorDataMap 的數(shù)據(jù)結(jié)構(gòu)嗜湃,來(lái)記錄每一個(gè)計(jì)算節(jié)點(diǎn)中 Executors 的資源狀態(tài)。ExecutorDataMap 是一種 HashMap澜掩,它的 Key 是標(biāo)記 Executor 的字符串购披,Value 是一種叫做 ExecutorData 的數(shù)據(jù)結(jié)構(gòu),ExecutorData 用于封裝 Executor 的資源狀態(tài)肩榕,如 RPC 地址刚陡、主機(jī)地址、可用 CPU 核數(shù)和滿配 CPU 核數(shù)等等点把,它相當(dāng)于是對(duì) Executor 做的“資源畫(huà)像”對(duì)外(tasks對(duì)資源的需求)
SchedulerBackend 以 WorkerOffer 為粒度提供計(jì)算資源橘荠,WorkerOffer 封裝了 Executor ID、主機(jī)地址和 CPU 核數(shù)郎逃,用來(lái)表示一份可用于調(diào)度任務(wù)的空閑資源哥童。
3.TaskScheduler(中介,將需求與資源按規(guī)則分配)
職責(zé):
基于既定的規(guī)則與策略達(dá)成供需雙方的匹配與撮合褒翰。
也就是將tasks 與 WorkerOffer按照規(guī)則與策略進(jìn)行匹配調(diào)度優(yōu)先級(jí)類(lèi)型
不同 Stages 之間
Stages 之間的任務(wù)調(diào)度贮懈,TaskScheduler 提供了 2 種調(diào)度模式匀泊,分別是 FIFO(先到先得)和 FAIR(公平調(diào)度)
FIFO(先到先得)
Stages 按照被創(chuàng)建的時(shí)間順序來(lái)依次消費(fèi)可用計(jì)算資源
FAIR(公平調(diào)度)
哪個(gè) Stages 優(yōu)先被調(diào)度,取決于用戶在配置文件 fairscheduler.xml 中的定義朵你。
在配置文件中各聘,Spark 允許用戶定義不同的調(diào)度池,每個(gè)調(diào)度池可以指定不同的調(diào)度優(yōu)先級(jí)抡医,用戶在開(kāi)發(fā)過(guò)程中可以關(guān)聯(lián)不同作業(yè)與調(diào)度池的對(duì)應(yīng)關(guān)系躲因,這樣不同 Stages 的調(diào)度就直接和開(kāi)發(fā)者的意愿掛鉤,也就能享受不同的優(yōu)先級(jí)待遇同 Stages 內(nèi)不同任務(wù)
當(dāng) TaskScheduler 接收到來(lái)自 SchedulerBackend 的 WorkerOffer 后忌傻,TaskScheduler 會(huì)優(yōu)先挑選那些滿足本地性級(jí)別要求的任務(wù)進(jìn)行分發(fā)
本地性級(jí)別
Process local < Node local < Rack local < Any
從左到右分別是進(jìn)程本地性大脉、節(jié)點(diǎn)本地性、機(jī)架本地性和跨機(jī)架本地性水孩。從左到右镰矿,計(jì)算任務(wù)訪問(wèn)所需數(shù)據(jù)的效率越來(lái)越差本地性級(jí)別如何確定
根據(jù)任務(wù)依賴(lài)的數(shù)據(jù)集分片所在的位置信息
本地性級(jí)別何時(shí)確定
DAGScheduler 劃分 Stages、創(chuàng)建分布式任務(wù)的過(guò)程中俘种,會(huì)為每一個(gè)任務(wù)指定本地性級(jí)別
任務(wù)調(diào)度流程圖
歸納
1.核心職責(zé)
先將用戶構(gòu)建的 DAG 轉(zhuǎn)化為分布式任務(wù)秤标,結(jié)合分布式集群資源的可用性,基于調(diào)度規(guī)則依序把分布式任務(wù)分發(fā)到執(zhí)行器 Executors宙刘;
2.核心原則
盡可能地讓數(shù)據(jù)呆在原地苍姜、保持不動(dòng),同時(shí)盡可能地把>>>承載計(jì)算任務(wù)的代碼分發(fā)到離數(shù)據(jù)最近的地方(Executors 或計(jì)算節(jié)點(diǎn))荐类,從而最大限度地降低分布式系統(tǒng)中的網(wǎng)絡(luò)開(kāi)銷(xiāo)怖现。