點擊上方 藍字關注我們
作者 | 宋哲琦
✎ 編 者 按
在不久前的 Apache DolphinScheduler Meetup 2021 上,有贊大數據開發平台負責人 宋哲琦 帶來了平台調度系統從 Airflow 遷移到 Apache DolphinScheduler 的方案設計思考和生產環境實踐。
這位來自浙江杭州的 90 后年輕人自 2019 年 9 月加入有贊,在這里從事數據開發平台、調度系統和數據同步組件的研發工作。剛入職時,有贊使用的還是同為 Apache 開源項目的 Airflow,但經過調研和生產環境測試,有贊決定切換到 DolphinScheduler。
有贊大數據開發平台如何利用調度系統?為什么決定重新選型為 Apache DolphinScheduler ?讓我們跟着他的分享來一探究竟。
01
有贊大數據開發平台(DP平台)
作為一家零售科技 SaaS 服務商,有贊的使命是助力線上商家開店,通過社交營銷和拓展全渠道零售業務,搭建數據產品和數字化解決方案,為驅動商家數字增長提供更好的 SaaS 能力。
目前,有贊在數據中台的支撐下已經建立了比較完整的數字產品矩陣:
為了支持日益增長的數據處理業務需求,有贊建立了大數據開發平台(以下簡稱 DP 平台)。這是一個大數據離線開發平台,提供用戶大數據任務開發所需的環境、工具和數據。
有贊大數據開發平台架構
有贊大數據開發平台主要由基礎組件層、任務組件層、調度層、服務層和監控層五個模塊組成。其中,服務層主要負責作業的生命周期管理,基礎組件層和任務組件層主要包括大數據開發平台依賴的中間件及大數據組件等基礎環境。DP 平台的服務部署主要采用主從模式,Master 節點支持 HA。調度層是在 Airflow 的基礎上進行二次開發,監控層對調度集群進行全方位監控和預警。
1
調度層架構設計
有贊大數據開發平台調度層架構設計
2017 年,我們團隊在17年的時候調研了當時的主流的調度系統,最終決定采用 Airflow(1.7)作為 DP 的任務調度模塊。根據業務場景實際需求,架構設計方面,我們采用了Airflow + Celery + Redis + MySQL的部署方案,Redis 作為調度隊列,通過 Celery 實現任意多台 worker 分布式部署。
在調度節點 HA 設計上,眾所周知,Airflow 在 schedule 節點上存在單點問題,為了實現調度的高可用,DP 平台采用了 Airflow Scheduler Failover Controller 這個開源組件,新增了一個 Standby 節點,會周期性地監聽 Active 節點的健康情況,一旦發現 Active 節點不可用,則 Standby 切換為 Active,從而保證 schedule 的高可用。
2
Worker節點負載均衡策略
另外,由於不同任務占據資源不同,為了更有效地利用資源,DP 平台按照 CPU 密集/內存密集區分任務類型,並安排在不同的 celery 隊列配置不同的 slot,保證每台機器 CPU/ 內存使用率保持在合理范圍內。
02
調度系統升級選型
自 2017 年有贊大數據平台 1.0 版本正式上線以來,我們已經在 2018 年 100% 完成了數據倉庫遷移的計划,2019 年日調度任務量達 30000+,到 2021 年,平台的日調度任務量已達到 60000+。伴隨着任務量的劇增,DP 的調度系統也面臨了許多挑戰與問題。
1
Airflow 的痛點
深度二次開發,脫離社區版本,升級成本高;
Python 技術棧,維護迭代成本高;
性能問題:
Airflow 的 schedule loop 如上圖所示,本質上是對 DAG 的加載解析,將其生成 DAG round 實例執行任務調度。Airflow 2.0 之前的版本是單點 DAG 掃描解析到數據庫,這就導致業務增長 Dag 數量較多時,scheduler loop 掃一次 Dag folder 會存在較大延遲(超過掃描頻率),甚至掃描時間需要 60-70 秒,嚴重影響調度性能。
4. 穩定性問題:
Airflow Scheduler Failover Controller 本質還是一個主從模式,standby 節點通過監聽 active進程是否存活來判斷是否切換,如之前遇到 deadlock 阻塞進程的情況,則會被忽略,進而導致調度故障發生。在生產環境中發生過類似問題后,我們經過排查后發現了問題所在,雖然 Airflow 1.10 版本已經修復了這個問題,但在主從模式下,這個在生產環境下不可忽視的問題依然會存在。
考慮到以上幾個痛點問題,我們決定對 DP 平台的調度系統進行重新選型。
在調研對比過程中,Apache DolphinScheduler 進入了我們的視野。同樣作為 Apache 頂級開源調度組件項目,我們性能、部署、功能、穩定性和可用性、社區生態等角度對原調度系統和 DolphinScheduler 進行了綜合對比。
以下為對比分析結果:
Airflow VS DolphinScheduler
1
DolphinScheduler 價值評估
如上圖所示,經過對 DolphinScheduler 價值評估,我們發現其在相同的條件下,吞吐性能是原來的調度系統的 2 倍,而 2.0 版本后 DolphinScheduler 的性能還會有更大幅度的提升,這一點讓我們非常興奮。
此外,在部署層面,DolphinScheduler 采用的 Java 技術棧有利於ops標准化部署流程,簡化發布流程、解放運維人力,且支持Kubernetes、Docker 部署,擴展性更強。
在功能新增上,因為我們在使用過程中比較注重任務依賴配置,而 DolphinScheduler 有更靈活的任務依賴配置,時間配置粒度細化到了時、天、周、月,使用體驗更好。另外,DolphinScheduler 的調度管理界面易用性更好,同時支持 worker group 隔離。作為一個分布式調度,DolphinScheduler 整體調度能力隨集群規模線性增長,而且隨着新特性任務插件化的發布,可自定義任務類型這一點也非常吸引人。
從穩定性與可用性上來說,DolphinScheduler 實現了高可靠與高可擴展性,去中心化的多 Master 多 Worker 設計架構,支持服務動態上下線,自我容錯與調節能力更強。
另外一個重要的點是,經過數月的接觸,我們發現 DolphinScheduler 社區整體活躍度較高,經常會有技術交流,技術文檔比較詳細,版本迭代速度也較快。
綜上所述,我們決定轉向 DolphinScheduler。
03
DolphinScheduler 接入方案設計
決定接入 DolphinScheduler 之后,我們梳理了平台對於新調度系統的改造需求。
總結起來,最重要的是要滿足以下幾點:
用戶使用無感知,平台目前的用戶數有 700-800,使用密度大,希望可以降低用戶切換成本;
調度系統可動態切換,生產環境要求穩定性大於一切,上線期間采用線上灰度的形式,希望基於工作流粒度,實現調度系統動態切換;
測試與發布的工作流配置需隔離,目前任務測試和發布有兩套配置文件通過 GitHub維護,線上調度任務配置需要保證數據整個確性和穩定性,需要兩套環境進行隔離。
針對以上三點,我們對架構進行了重新設計。
1
架構設計
保留現有前端界面與DP API;
重構調度管理界面,原來是嵌入 Airflow 界面,后續將基於 DolphinScheduler 進行調度管理界面重構;
任務生命周期管理/調度管理等操作通過 DolphinScheduler API 交互;
利用 Project 機制冗余工作流配置,實現測試、發布的配置隔離。
改造方案設計
架構設計完成之后,進入改造階段。我們對 DolphinScheduler 的工作流定義、任務執行流程、工作流發布流程都進行了改造,並進行了一些關鍵功能補齊。
工作流定義狀態梳理
我們首先梳理了 DolphinScheduler 工作流的定義狀態。因為 DolphinScheduler 工作的定義和定時管理會區分為上下線狀態, 但 DP平台上兩者的狀態是統一的,因此在任務測試和工作流發布流程中,需要對 DP到DolphinScheduler 的流程串聯做相應的改造。
任務執行流程改造
首先是任務測試流程改造。在切換到 DolphinScheduler 之后,所有的交互都是基於DolphinScheduler API 來進行的,當在 DP 啟動任務測試時,會在 DolphinScheduler 側生成對應的工作流定義配置,上線之后運行任務,同時調用 DolphinScheduler 的日志查看結果,實時獲取日志運行信息。
工作流發布流程改造
其次,針對工作流上線流程,切換到 DolphinScheduler 之后,主要是對工作流定義配置和定時配置,以及上線狀態進行了同步。
通過這兩個核心流程的改造。工作流的原數據維護和配置同步其實都是基於 DP master來管理,只有在上線和任務運行時才會到調度系統進行交互,基於這點,DP 平台實現了工作流維度下的系統動態切換,以便於后續的線上灰度測試。
2
功能補全
此外,DP 平台還進行了一些功能補齊。首先是任務類型的適配。
任務類型適配
目前,DolphinScheduler 平台已支持的任務類型主要包含數據同步類和數據計算類任務,如Hive SQL 任務、DataX 任務、Spark 任務等。因為任務的原數據信息是在 DP 側維護的,因此 DP 平台的對接方案是在 DP 的 master 構建任務配置映射模塊,將 DP 維護的 task 信息映射到 DP 側的 task,然后通過 DolphinScheduler 的 API 調用來實現任務配置信息傳遞。
因為 DolphinScheduler 已經支持部分任務類型 ,所以只需要基於 DP 平台目前的實際使用場景對 DolphinScheduler 相應任務模塊進行定制化改造。而對於 DolphinScheduler 未支持的任務類型,如Kylin任務、算法訓練任務、DataY任務等,DP 平台也計划后續通過 DolphinScheduler 2.0 的插件化能力來補齊。
3
改造進度
因為 DP 平台上 SQL 任務和同步任務占據了任務總量的 80% 左右,因此改造重點都集中在這幾個任務類型上,目前已基本完成 Hive SQL 任務、DataX 任務以及腳本任務的適配改造以及遷移工作。
4
功能補齊
Catchup 機制實現調度自動回補
DP 在實際生產環境中還需要一個核心能力,即基於 Catchup 的自動回補和全局補數能力。
Catchup 機制在 DP 的使用場景,是在調度系統異常或資源不足,導致部分任務錯過當前調度出發時間,當恢復調度后,會通過Catchup 自動補齊未被觸發的調度執行計划。
以下三張圖是一個小時級的工作流調度執行的信息實例。
在圖 1 中,工作流在 6 點准時調起,每小時調一次,可以看到在 6 點任務准時調起並完成任務執行,當前狀態也是正常調度狀態。
圖1
圖 2 顯示在 6 點完成調度后,一直到 8 點期間,調度系統出現異常,導致 7 點和 8點該工作流未被調起。
圖2
圖 3 表示當 9 點恢復調度之后,因為 具有 Catchup 機制,調度系統會自動回補之前丟失的執行計划,實現調度的自動回補。
圖3
此機制在任務量較大時作用尤為顯著,當 Schedule 節點異常或核心任務堆積導致工作流錯過調度出發時間時,因為系統本身的容錯機制可以支持自動回補調度任務,所以無需人工手動補數重跑。
同時,這個機制還應用在了 DP 的全局補數能力中。
跨 Dag 全局補數
DP 平台跨 Dag 全局補數流程
全局補數在有贊的主要使用場景,是用在核心上游表產出中出現異常,導致下游商家展示數據異常時。這種情況下,一般都需要系統能夠快速重跑整個數據鏈路下的所有任務實例。
DP 平台目前是基於 Clear 的功能,通過原數據的血緣解析獲取到指定節點和當前調度周期下的所有下游實例,再通過規則剪枝策略過濾部分無需重跑的實例。獲取到這些實際列表之后,啟動 clear down stream 的清除任務實例功能,再利用 Catchup 進行自動回補。
這個流程實際上是通過 Clear 實現上游核心的全局重跑,自動補數的優勢就在於可以解放人工操作。
因為跨 Dag 全局補數能力在生產環境中是一個重要的能力,我們計划在 DolphinScheduler 中進行補齊。
04
現狀&規划&展望
1
DolphinScheduler 接入現狀
DP 平台目前已經在測試環境中部署了部分 DolphinScheduler 服務,並遷移了部分工作流。
對接到 DolphinScheduler API 系統后,DP 平台在用戶層面統一使用 admin 用戶,因為其用戶體系是直接在 DP master 上進行維護,所有的工作流信息會區分測試環境和正式環境。
DolphinScheduler 工作流定義列表
DolphinScheduler 2.0工作流任務節點展示
DolphinScheduler 2.0 整體的 UI 交互看起來更加簡潔,可視化程度更高,我們計划直接升級至 2.0 版本。
2
接入規划
目前 ,DP 平台還處於接入 DolphinScheduler 的灰度測試階段,計划於今年 12 月進行工作流的全量遷移,同時會在測試環境進行分階段全方位測試或調度性能測試和壓力測試。確定沒有任何問題后,我們會在來年 1 月進行生產環境灰度測試,並計划在 3 月完成全量遷移。
3
對 DolphinScheduler 的期待
未來,我們對 DolphinScheduler 最大的期待是希望 2.0 版本可以實現任務插件化。
目前,DP 平台已經基於 DolphinScheduler 2.0實現了告警組件插件化,可在后端定義表單信息,並在前端自適應展示。
“
希望 DolphinScheduler 插件化的腳步可以更快一些,以更好地快速適配我們的定制化任務類型。
——有贊大數據開發平台負責人 宋哲琦
”05
參與貢獻
隨着國內開源的迅猛崛起,Apache DolphinScheduler 社區迎來蓬勃發展,為了做更好用、易用的調度,真誠歡迎熱愛開源的伙伴加入到開源社區中來,為中國開源崛起獻上一份自己的力量,讓本土開源走向全球。
參與 DolphinScheduler 社區有非常多的參與貢獻的方式,包括:
貢獻第一個PR(文檔、代碼) 我們也希望是簡單的,第一個PR用於熟悉提交的流程和社區協作以及感受社區的友好度。
社區匯總了以下適合新手的問題列表:https://github.com/apache/dolphinscheduler/issues/5689
非新手問題列表:https://github.com/apache/dolphinscheduler/issues?q=is%3Aopen+is%3Aissue+label%3A%22volunteer+wanted%22
如何參與貢獻鏈接:https://dolphinscheduler.apache.org/zh-cn/docs/development/contribute.html
來吧,DolphinScheduler開源社區需要您的參與,為中國開源崛起添磚加瓦吧,哪怕只是小小的一塊瓦,匯聚起來的力量也是巨大的。
參與開源可以近距離與各路高手切磋,迅速提升自己的技能,如果您想參與貢獻,我們有個貢獻者種子孵化群,可以添加社區小助手
微信(Leonard-ds) 手把手教會您( 貢獻者不分水平高低,有問必答,關鍵是有一顆願意貢獻的心 )。添加小助手微信時請說明想參與貢獻。
來吧,開源社區非常期待您的參與。
社區官網
https://dolphinscheduler.apache.org/
代碼倉地址https://github.com/apache/dolphinscheduler
您的 Star,是 Apache DolphinScheduler 為愛發電的動力❤️ ~
投稿請添加社區小助手微信
(Leonard-ds)
☞在生鮮零售業,DolphinScheduler 還能這么玩!
☞4 億用戶,7W+ 作業調度難題,Bigo 基於 Apache DolphinScheduler 巧化解
☞荔枝機器學習平台與大數據調度系統“雙劍合璧”,打造未來數據處理新模式!
☞看到社區代碼不規范,強迫症的我順手就給格式化了!
☞最佳實踐|聯通數科基於 DolphinScheduler 的二次開發
☞DolphinScheduler 榮獲 2021 中國開源雲聯盟優秀開源項目獎!
☞重構、插件化、性能提升 20 倍,Apache DolphinScheduler 2.0 alpha 發布亮點太多!
☞巨變!a16z 關於新一代數據基礎設施架構的深度洞察
☞手把手教你 Apache DolphinScheduler 本地開發環境搭建 | 中英文視頻教程
點擊閱讀原文,加入開源!
點個在看你最好看