1. 程式人生 > 其它 >杭州思科對 Apache DolphinScheduler Alert 模組的改造

杭州思科對 Apache DolphinScheduler Alert 模組的改造


杭州思科已經將 Apache DolphinScheduler 引入公司自建的大資料平臺。目前,杭州思科大資料工程師 李慶旺 負責 Alert 模組的改造已基本完成,以更完善的 Alert 模組適應實際業務中對複雜告警的需求。

 

PROFILE

 


李慶旺

杭州思科 大資料工程師,主要負責 Spark、排程系統等大資料方向開發。

我們在使用原有的排程平臺處理大資料任務時,在操作上多有不便。比如一個對資料進行處理聚合分析的任務,首先由多個前置 Spark 任務對不同資料來源資料進行處理、分析。最後的 Spark 任務對這期間處理的結果進行再次聚合、分析,得到我們想要的最終資料。但遺憾的是當時的排程平臺無法序列執行多個任務,需要估算任務處理時間來設定多個任務的開始執行時間。同時其中一個任務執行失敗,需要手動停止後續任務。這種方式既不方便,也不優雅。 而 Apache DolphinScheduler 的核心功能——工作流定義

可以將任務串聯起來,完美契合我們的需求。於是,我們將 Apache DolphinScheduler 引入自己的大資料平臺,而我主要負責 Alert 模組改造。目前我們其他同事也在推進整合 K8s,希望未來任務在 K8s 中執行。 今天分享的是 Alert 模組的改造。

 

01 Alert 模組的設計

 

DolphinScheduler Alert 模組的設計


 Apache DolphinScheduler 1.0 版本的 Alert 模式使用配置alert.properties的方式,通過配置郵箱、簡訊等實現告警,但這樣的方式已經不適用於當前的場景了。官方也進行過告警模組重構,詳情設計思路參考官方文件:


https://github.com/apache/dolphinscheduler/issues/3049
https://dolphinscheduler.apache.org/zh-cn/development/backend/spi/alert.html Apache 

 

DolphinScheduler 告警模組是一個獨立啟動的服務,核心之一是 AlertPluginManager 類。告警模組集成了很多外掛,如釘釘、微信、飛書、郵件等,以獨立的形式寫在原始碼中,啟動服務時會解析外掛並將配置的引數格式化成JSON形式,前端通過JSON自動渲染出頁面。AlertPluginManager 在啟動時會快取外掛到記憶體中。AlertServer類會啟動執行緒池,定時掃描DB。 當工作流配置了通知策略,同時Worker 執行工作流結束,執行結果匹配通知策略成功後,DB插入告警資料後,執行緒池掃描 DB,呼叫AlertSender 類的send方法傳入告警資料。告警資料繫結的是告警組,一個告警組對應了多個告警例項。AlertSender類遍歷告警例項,通過AlertPluginManager類獲取外掛例項,呼叫例項的傳送方法,最後更新結果。這是 Apache DolphinScheduler 的整個告警流程。 需要注意的是,Alert  server 啟動的同時也啟動了 RPC 服務,這是一種針對特殊型別任務,如 SQL 查詢報表而設計的告警方式,可以讓 Worker 通過 RPC 直接訪問 Alert  Server,利用 Alert 模組完成告警,這個資料不寫入 DB。但從整體上來說,Apache DolphinScheduler 的告警模式還是以寫 DB,非同步互動的方式為主。 

 

定義工作流之後,可以在啟動前設定通知策略,繫結告警組。

 

在任務維度,可以配置超時告警,當任務超時可以觸發報警。這裡沒有告警組配置,任務和工作流共用一個告警組,當任務超時,會推送到工作流設定的告警組。 

 上圖為系統告警配置的流程圖。可以看到,一個工作流可以配置多個任務例項,任務可以配置超時觸發告警,工作流成功或者失敗可以觸發告警。一個告警組可以繫結多個告警例項。這樣的配置不太合理,我們希望告警例項也可以匹配工作流/任務例項的狀態,也就是工作流成功和失敗呼叫同一個告警組,但是觸發不同的告警例項。這樣使用起來更符合真實場景。 

建立告警組,一個告警組可以繫結多個告警例項。 

 

02 大資料任務告警場景

 


以下是我們日常工作中的一些 常見的大資料任務告警場景。 對於定時任務,在開始執行前、任務上線、下線或修改引數,以及任務執行成功或失敗時都發送通知。區別是,對於同一任務不同結果,我們希望觸發不同的通知,比如成功發簡訊通知或者釘釘微信群通知即可,而任務失敗了需要在第一時間通知對應的研發人員,以得到更快的響應,這時候釘釘微信群中@對應研發人員或者電話通知會更及時。目前,公司的任務排程平臺是任務中呼叫API 進行通知,這種與程式碼強耦合的方式極其不方便,實際上可以抽象成一個更為通用的模組來實現。 Apache DolphinScheduler 的架構雖然符合實際場景需求,但問題在於告警模組頁面配置只能選擇成功觸發通知,或失敗觸發通知,繫結的是同一個告警組,即無論成功還是失敗,告警的途徑是相同的,這一點並不滿足我們在實際生產環境中需要不同結果以不同方式通知的需求。因此,我們對 Alert 模組進行了一些改造。

03 Alert 模組的改造

 

 改造的第一步是告警例項。此前,新增一個告警例項,觸發告警就會觸發該例項的 send 方法,我們希望在定義告警例項時可以繫結一個告警策略,有三個選項,成功發、失敗發,以及成功和失敗都發。 在任務定義維度,有一個超時告警的功能,實際上對應失敗的策略。 


上圖為改造完成的配置頁面,在建立告警例項頁面,我們添加了一個告警型別欄位,選擇是在成功、失敗,或者無論成功或失敗時呼叫外掛。 


上圖為改造後Apache DolphinScheduler 告警模組的架構,我們對其中進行了兩點改造。 其一,在執行完工作流或任務時,如果觸發告警,在寫入DB時,會儲存本次工作流或者任務的執行結果,具體是成功還是失敗。第二,呼叫告警例項傳送方法添加了一個邏輯判斷,將告警例項與任務狀態進行匹配,匹配則執行該告警例項傳送邏輯,不匹配則過濾。 改造後告警模組支援場景如下: 

 

詳細設計請參考 issue:https://github.com/apache/dolphinscheduler/issues/7992

 

程式碼詳見:https://github.com/apache/dolphinscheduler/pull/8636


此外,我們還針對 Apache DolphinScheduler 的告警模組向社群提出幾點優化的建議,感興趣的小夥伴可以跟進 issue,一起來做後續的工作:

  • 工作流啟動或上下線或引數修改時,可以觸發通知;

  • 告警場景針對 worker 的監控,如果 worker 掛掉或和 ZK 斷開失去心跳,會認為 worker 宕機,會觸發告警,但會預設匹配 ID 為 1 的告警組。這樣的設定是在原始碼中寫明的,但不看原始碼不知道其中的邏輯,不會專門設定ID為1的告警組,無法第一時間得到worker宕機的通知;

  • 告警模組目前支援飛書、釘釘、微信、郵件等多種外掛,這些外掛適用於國內使用者,但國外使用者可能使用不同的外掛,如思科使用的 Webex Teams,國外常用告警外掛 PagerDuty,我們也都進行開發並貢獻給了社群。同時還有一些比較常用的比如Microsoft Teams等,感興趣的小夥伴也可以提個PR,貢獻到社群。


最後一點,可能大資料領域的小夥伴對於前端不太熟悉,想要開發並貢獻告警外掛,但是想到需要開發前端就不想進行下去了。開發 Apache DolphinScheduler 告警外掛是不需要寫前端程式碼的,只需要在新建告警例項外掛時,在 Java 程式碼中配置好頁面中需要輸入的引數或者需要選擇的按鈕(原始碼詳見org.apache.dolphinscheduler.spi.params),系統會自動格式化成 JSON 格式,前端通過form-create 可以通過 JSON 自動渲染成頁面。因此,完全不用擔心寫前端的問題。 

 

參與開源

隨著國內開源的迅猛崛起,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)