一、調(diào)度系統(tǒng)簡介
Buffalo調(diào)度是一款京東自主研發(fā)的分布式DAG作業(yè)調(diào)度系統(tǒng)。為京東的數(shù)據(jù)開發(fā)工程師、算法工程師、數(shù)據(jù)分析師等用戶提供了離線作業(yè)的編排&調(diào)試、監(jiān)控運(yùn)維、DAG調(diào)度等系統(tǒng)能力,致力于打造行業(yè)領(lǐng)先的穩(wěn)定高效、產(chǎn)品簡潔高體驗(yàn)、任務(wù)監(jiān)控全面、資源容器化、系統(tǒng)能力開放化的ETL調(diào)度系統(tǒng)。
在京東調(diào)度系統(tǒng)核心面臨的挑戰(zhàn)有以下幾個:
1.業(yè)務(wù)復(fù)雜帶來的依賴關(guān)系復(fù)雜:復(fù)雜的數(shù)據(jù)鏈路,使得部分任務(wù)有數(shù)百、甚至上千個上下游,層級多達(dá)數(shù)十層??缣煲蕾?、數(shù)據(jù)回刷、月度匯總等業(yè)務(wù)場景,需任務(wù)間依賴存在大小周期依賴、跨天依賴等復(fù)雜場景,任務(wù)依賴關(guān)系數(shù)據(jù)構(gòu)成一個龐大且復(fù)雜的有向無環(huán)圖。
2.業(yè)務(wù)體量大且穩(wěn)定性&性能要求高:目前平臺有數(shù)十萬任務(wù),百萬+依賴關(guān)系,日均百萬+調(diào)度頻次,不僅關(guān)系復(fù)雜、執(zhí)行量大,且系統(tǒng)的任何細(xì)微異常,都可能導(dǎo)致數(shù)據(jù)鏈路異常,核心數(shù)據(jù)受損,這對調(diào)度系統(tǒng)的穩(wěn)定性和性能帶來了不小挑戰(zhàn)。
3.數(shù)據(jù)加工場景復(fù)雜需支撐豐富調(diào)度能力:支持集團(tuán)多個BG業(yè)務(wù),業(yè)務(wù)場景多樣,涉及數(shù)據(jù)采集、數(shù)據(jù)計(jì)算、數(shù)據(jù)推送、數(shù)據(jù)轉(zhuǎn)換等多種任務(wù)類型、多種執(zhí)行方式、多種觸發(fā)規(guī)則,以及控制節(jié)點(diǎn)、任務(wù)間的數(shù)據(jù)傳遞、數(shù)據(jù)補(bǔ)錄場景等,對系統(tǒng)功能的豐富度和靈活度提出新要求。
二、核心技術(shù)方案
為支撐靈活的業(yè)務(wù)加工和工作流編排場景,快速的業(yè)務(wù)發(fā)展帶來的任務(wù)量增長,以及保障整個系統(tǒng)的穩(wěn)定性,我們從易用性、穩(wěn)定性、以及高性能等方面做了很多的思考和優(yōu)化,下面我將著重從這三個方面詳細(xì)介紹。
1. 實(shí)體和編排調(diào)度模型
a) 雙層實(shí)體模型
采用主流的雙層實(shí)體模型,雙層實(shí)體模型中,包含兩個核心概念:
?Action(環(huán)節(jié)):環(huán)節(jié)是最小粒度的執(zhí)行單位,攜帶執(zhí)行相關(guān)的信息,如腳本、參數(shù)、環(huán)境等。
?Task(任務(wù)):任務(wù)是由一個或多個環(huán)節(jié)+觸發(fā)規(guī)則構(gòu)成的DAG,Task和Task之間也可以相互依賴,在外層構(gòu)成一個DAG,實(shí)現(xiàn)雙層調(diào)度。
相比單層實(shí)體模型,編排能力更強(qiáng),有更好的靈活性,同時對于單個業(yè)務(wù)的整合打包和管理也更友好。
b) 基于實(shí)例的調(diào)度
任務(wù)定義是任務(wù)配置的載體,無狀態(tài),不可執(zhí)行,任務(wù)當(dāng)?shù)竭_(dá)運(yùn)行周期時,會產(chǎn)生相應(yīng)周期的任務(wù)實(shí)例(產(chǎn)生實(shí)例的過程叫“實(shí)例化”),實(shí)例化時會根據(jù)任務(wù)的配置信息,包括:環(huán)節(jié)、上游依賴、數(shù)據(jù)依賴、運(yùn)行周期等,生成當(dāng)前周期實(shí)例,可理解為任務(wù)的一個快照,任務(wù)實(shí)例是真正可執(zhí)行、并具有狀態(tài)的對象。
基于實(shí)例的調(diào)度模式,其優(yōu)點(diǎn)在于:
?周期穩(wěn)定:任務(wù)的每個周期都會有實(shí)例,不會出現(xiàn)周期缺失的情況,且每個周期的實(shí)例可獨(dú)立操作
?依賴明確:任務(wù)某個周期的實(shí)例,其對上游任務(wù)實(shí)例的依賴,或者數(shù)據(jù)依賴是明確的、可預(yù)期的,同時對某個周期的數(shù)據(jù)可從整個鏈路上快速追溯,并在產(chǎn)生問題是可從鏈路層面快速修復(fù)。
c) 分類分級調(diào)度能力
平臺中的任務(wù)不通業(yè)務(wù),重要性存在一定差異,為提升核心任務(wù)的保障能力,平臺提供任務(wù)分類分級管理,和基于分級的調(diào)度能力,在客戶端資源較為緊張時,會優(yōu)先保障重要業(yè)務(wù)。同時任務(wù)等級信息會透傳到底層集群,在底層計(jì)算集群層面也增加相應(yīng)基于分類和等級的保障策略,保障核心業(yè)務(wù)的穩(wěn)定性。
2. 高可用架構(gòu)
buffalo整體有分三層,每一層都具備高可用架構(gòu),使得整體具備高可用和容災(zāi)能力
?a) Manager管理層:
?主要提供產(chǎn)品化管理能力,包括任務(wù)的創(chuàng)建、任務(wù)管理、任務(wù)運(yùn)維等,管理端無狀態(tài),可橫向擴(kuò)展,負(fù)載對外提供服務(wù)
?b) 高可用Scheduler:
?也叫NameNode是Buffalo核心調(diào)度引擎,負(fù)責(zé)任務(wù)實(shí)例的周期生成,以及基于DAG的雙層任務(wù)實(shí)例的調(diào)度、客戶端資源的調(diào)度(物理資源、彈性資源)、任務(wù)狀態(tài)的處理等。
?整體采用多活+主備高可用架構(gòu),多個scheduler會通過數(shù)據(jù)分片負(fù)載處理任務(wù),同時對于任務(wù)狀態(tài)消息進(jìn)行冪等處理,其中資源調(diào)度模塊采用主備模式,以便支撐靈活和高效的資源調(diào)度能力。當(dāng)一個節(jié)點(diǎn)故障時,其他節(jié)點(diǎn)會監(jiān)測到節(jié)點(diǎn)下線,并自動觸發(fā)接管邏輯,將異常節(jié)點(diǎn)任務(wù)接管處理,保障故障節(jié)點(diǎn)上的任務(wù)執(zhí)行不受影響。
?c) 容錯執(zhí)行層:
?執(zhí)行層的核心職責(zé)是負(fù)責(zé)任務(wù)啟動執(zhí)行,并監(jiān)聽任務(wù)執(zhí)行結(jié)果、采集任務(wù)日志、上報(bào)任務(wù)狀態(tài),執(zhí)行層支持物理機(jī)和基于k8s的容器化資源兩種模式。
?物理機(jī):部署worker(也稱TaskNode)長進(jìn)程,任務(wù)以獨(dú)立進(jìn)程方式運(yùn)行,多個worker構(gòu)成節(jié)點(diǎn)組對(虛擬節(jié)點(diǎn))外服務(wù),避免單點(diǎn)故障問題。同時worker本身支持消息重傳、cgroup資源隔離等高可用特性。
?k8s彈性資源:與原生k8s對接,任務(wù)以短周期pod方式執(zhí)行,任務(wù)結(jié)束時pod銷毀,天然具備高可用特性,同時具備更精細(xì)化的資源管理、差異化執(zhí)行環(huán)境的動態(tài)構(gòu)建能力。
3. 高性能
前面提到調(diào)度系統(tǒng)中隨著任務(wù)量的增長,業(yè)務(wù)復(fù)雜度的提升,需要調(diào)度執(zhí)行的DAG實(shí)例梳理,以及DAG的復(fù)雜度都會不斷提升,buffalo主要從以下幾個方面來做到高容量、低延遲的編排和調(diào)度。
1) 水平擴(kuò)展
如上高可用架構(gòu)部分介紹,調(diào)度引擎采用多活架構(gòu),可水平擴(kuò)展,不同服務(wù)之間通過數(shù)據(jù)哈希分片,將任務(wù)負(fù)載分布到多臺服務(wù)進(jìn)行調(diào)度,同時各服務(wù)通過執(zhí)行批次和狀態(tài)進(jìn)行冪等處理,保障任務(wù)執(zhí)行的唯一性。
2) 事件驅(qū)動
a. 定時輪詢(如左圖)
傳統(tǒng)的任務(wù)執(zhí)行方式大多采用定時輪詢的方式,這種方式需要定時查詢所有待執(zhí)行的任務(wù)實(shí)例,然后逐一校驗(yàn)任務(wù)實(shí)例的依賴條件是否滿足(如任務(wù)依賴、數(shù)據(jù)依賴、并發(fā)限制等),這種方式在面臨大數(shù)據(jù)量任務(wù)時,有幾個核心問題:
?遍歷耗時:系統(tǒng)中可能有非常多的任務(wù)待執(zhí)行(有些滿足條件、有些不滿足條件),這樣每次獲取的任務(wù)列表會非常長(可能數(shù)十萬或百萬),這樣遍歷一遍非常耗時
?大量無用計(jì)算:在這些獲取的任務(wù)列表中,每個任務(wù)都需要進(jìn)行多種條件校驗(yàn),且只有少數(shù)任務(wù)是滿足執(zhí)行條件,絕大部分的校驗(yàn)是無用校驗(yàn)
b. 基于事件驅(qū)動(如右圖)
相比定時輪詢,事件驅(qū)動不會采用定時拉取、全量校驗(yàn)的方式,而是在任務(wù)所依賴條件的狀態(tài)發(fā)生變更時,才會基于事件做出相應(yīng)的條件計(jì)算和校驗(yàn)動作,這樣可以有效避免定時輪詢面臨的兩個核心問題。同時針對不同的事件類型,可以分別進(jìn)行異步并行處理,有效提升整體的處理性能。
3) 內(nèi)存調(diào)度
前面提到Buffalo具備在物理機(jī)集群和k8s集群上啟動任務(wù)執(zhí)行的能力,所以需要具備這兩種資源的管理和資源調(diào)度能力,資源調(diào)度的性能也是影響任務(wù)分發(fā)時效的關(guān)鍵部分。
調(diào)度引擎namenode采用的是多活的高可用架構(gòu),如果資源調(diào)度部分也采用該架構(gòu)(如左圖),那么涉及到同一資源的并發(fā)訪問和修改的問題,進(jìn)而引入分布式鎖和外部存儲,這樣整體的性能很難達(dá)到理想的目標(biāo)。
因此,我們在namenode多活架構(gòu)的基礎(chǔ)上,將資源調(diào)度部分做了一個主備架構(gòu)的處理(如右圖),會從多個namenode里選擇一個作為主資源調(diào)度器,其他作為熱備,所有namenode的任務(wù)資源請求都由主節(jié)點(diǎn)進(jìn)行處理,這樣主節(jié)點(diǎn)在內(nèi)存中保存了所有的資源信息,資源調(diào)度過程在內(nèi)存中就可進(jìn)行,避免了分布式鎖和對外部存儲的依賴,性能有大幅提升。
4) 冷熱數(shù)據(jù)分離
當(dāng)系統(tǒng)中任務(wù)量較大,任務(wù)執(zhí)行產(chǎn)生的實(shí)例數(shù)據(jù)會快速增長,當(dāng)前buffalo每日的實(shí)例數(shù)據(jù)增量接近百萬,隨著任務(wù)量的增長還會持續(xù)增長,如果沒有適當(dāng)?shù)姆桨竵硖幚?,?shù)據(jù)庫很難支撐如此快速的數(shù)據(jù)增長。
調(diào)度系統(tǒng)中的任務(wù)有個明顯特征 -定時,就是任務(wù)會定時執(zhí)行,執(zhí)行完成后的實(shí)例,除人為干預(yù)外其狀態(tài)不會再自動發(fā)生變更,這部分?jǐn)?shù)據(jù)一般只會做查詢,所以這部分?jǐn)?shù)據(jù)可以做獨(dú)立存儲。我們將狀態(tài)還會發(fā)生變更或頻繁操作的數(shù)據(jù)稱作熱數(shù)據(jù),將這些已經(jīng)執(zhí)行結(jié)束且基本只有查詢需求的數(shù)據(jù)稱作冷數(shù)據(jù),并將冷數(shù)據(jù)單獨(dú)存儲。
當(dāng)冷熱數(shù)據(jù)分離后,有三個核心問題需要解決:
1)數(shù)據(jù)結(jié)轉(zhuǎn)
任務(wù)實(shí)例執(zhí)行完成,處于結(jié)束狀態(tài)的實(shí)例都可以被結(jié)轉(zhuǎn),目前采用定時結(jié)轉(zhuǎn)的策略。為避免冷數(shù)據(jù)單表數(shù)據(jù)量過大,結(jié)轉(zhuǎn)規(guī)則可以按照季度、月或則更小周期進(jìn)行拆分存儲。
2) 數(shù)據(jù)定位
當(dāng)數(shù)據(jù)結(jié)轉(zhuǎn)到冷數(shù)據(jù)表后,這些實(shí)例的狀態(tài)不會發(fā)生變更,單可能還會被未執(zhí)行的實(shí)例所依賴,用戶也可能會對這些實(shí)例做檢索操作,所以這些實(shí)例需要能從冷數(shù)據(jù)表中快速被定位。
?索引表:數(shù)據(jù)結(jié)轉(zhuǎn)到冷數(shù)據(jù)表時,會根據(jù)冷數(shù)據(jù)表的分區(qū)粒度,在索引表記錄各冷分區(qū)表中的數(shù)據(jù)范圍,如計(jì)劃運(yùn)行時間在2023-01-01 至 2023-03-31的數(shù)據(jù)存儲在2023Q1分區(qū)表,這樣在定位時可以圈定數(shù)據(jù)范圍,避免全量掃描。
?數(shù)據(jù)定位:因?qū)嵗龜?shù)據(jù)是有周期性的,有非常強(qiáng)的時間特性,所以可以結(jié)合任務(wù)實(shí)例的計(jì)劃運(yùn)行時間,和索引表的數(shù)據(jù)范圍,快速定位任務(wù)某個范圍的實(shí)例所在的分區(qū)。
3)冷數(shù)據(jù)操作
冷數(shù)據(jù)被操作的幾率比較低,但也存在操作的可能性,比如歷史實(shí)例的重跑、強(qiáng)制成功等操作。為了保持調(diào)度引擎架構(gòu)的簡單性,所有相關(guān)的任務(wù)執(zhí)行的處理,都是基于當(dāng)前表(熱表),所以為了能保障被結(jié)轉(zhuǎn)的冷數(shù)據(jù)和熱數(shù)據(jù)一樣支持所有操作,冷數(shù)據(jù)被操作時會從冷數(shù)據(jù)表恢復(fù)至熱數(shù)據(jù)表,從而實(shí)現(xiàn)與熱數(shù)據(jù)相同的效果。
4、開放能力
開放API:通過Http協(xié)議進(jìn)行開放,支持任務(wù)配置管理、任務(wù)實(shí)例操作、狀態(tài)查詢、日志查詢等能力,通過藏經(jīng)閣進(jìn)行開放來服務(wù)業(yè)務(wù)
開放事件:基于JDQ異步消息的方式將任務(wù)狀態(tài)、實(shí)例狀態(tài)進(jìn)行開放,聯(lián)動業(yè)務(wù)個性化處理。狀態(tài)發(fā)生變更及時同步,確保業(yè)務(wù)觸達(dá)的及時性
三、未來規(guī)劃
Buffalo調(diào)度系統(tǒng)仍在持續(xù)的優(yōu)化和迭代升級,不僅提供更好的用戶體驗(yàn)、更極致的性能,也包括容器化能力、插件化擴(kuò)展能力、開放能力、精細(xì)化的資源管理能力等,希望大家提出更好的想法和建議,一起打造穩(wěn)定、高效、易用的調(diào)度平臺。
審核編輯 黃宇
-
調(diào)度系統(tǒng)
+關(guān)注
關(guān)注
0文章
43瀏覽量
9484 -
架構(gòu)
+關(guān)注
關(guān)注
1文章
513瀏覽量
25468 -
DAG
+關(guān)注
關(guān)注
0文章
17瀏覽量
8146
發(fā)布評論請先 登錄
相關(guān)推薦
評論