海豚排程監控:新增依賴缺失巡檢,上游改動再也不用擔心了!

海豚调度發表於2024-07-04

💡 本系列文章是 DolphinScheduler 由淺入深的教程,涵蓋搭建、二開迭代、核心原理解讀、運維和管理等一系列內容。適用於想對 DolphinScheduler瞭解或想要加深理解的讀者。

祝開卷有益:)

用過 DolphinScheduler 的小夥伴應該都知道,DolphinScheduler 的依賴任務是被動檢測的,下游配置了上游的依賴,下游任務啟動的時候,會檢測上游任務是否成功,這個過程不是很複雜,但卻是比較容易出問題的。

file

本文先說明了依賴節點刪除的影響(背景),最後是巡檢任務的邏輯(解決方案)。

感興趣的小夥伴也可以看看之前的歷史文章:

海豚排程調優 | 如何解決任務被禁用出現的Bug

海豚排程調優 | 正在執行的工作流(DAG)如何重新拉起失敗的任務(Task)

背景:

使用排程的團隊越來越多,任務也越來越多,互相依賴的任務也變多了,任務會隨著數倉的迭代,進行下線、刪除等操作。

如圖,工作流① 裡面有任務 A,工作流② 裡面有任務 dep_A 和 B

file

開啟依賴節點dep_A,可以看到上游任務是 A,可以正常限時任務名字。

file

我把任務 A 刪掉,如圖1-3,開啟依賴節點dep_A,就只能看到一個code,不能顯示名稱了。(其實就是找不到上游任務了)。

file

工作流② 後面在執行的時候,依賴節點dep_A,在執行的時候就會一直卡在那裡,找不上游任務,因為已經被刪了或者被禁用了。

為什麼呢?因為依賴(DEPENDE)節點裡面配置的是上游任務的projectCodedefinitionCodedepTaskCode。只要上游任務被禁用、刪除、或者複製了一個新的出來,depTaskCode 就會變或者找不到。

依賴節點找不到上游任務是誰,就沒辦法判斷執行狀態了,就會一直卡在那裡。

解決方案:

回到生產環境,使用排程的團隊越來越多,任務也越來越多,互相依賴的任務也變多了,任務會隨著數倉的迭代,進行下線、刪除等操作。這種依賴缺失的現象就越來越多了,這是使用者操作不當導致的重大生產事故,必須要防止這種情況。

解決方案就是新增一個依賴巡檢。一段 SQL + 一個告警指令碼搞定!

file
第一步是先清理排程任務的血緣關係到一張 mysql 表。
第二步是檢測依賴缺失,報警到釘釘群。

先看下 SQL主要邏輯邏輯,清洗排程任務的關係,包括依賴節點,依賴節點是一個json結構的資料,把它解析出來,最後看關聯不上的任務,就是缺失依賴的任務,然後告警出來。
file

①清洗邏輯如下:

指令碼放在 GitHub上了,dep_mysql.sql[1]
清洗之後,產出了 4 張表
1.t_ds_dag_task_relation_base_data 關係基礎資料表

2.t_ds_task_node_base_data 任務基礎表,後續會用於 Nebula Graph,這個後面會講。

3.t_ds_dag_task_relation_dep_data_df 依賴節點關係表,用於後續依賴告警的的主表

4.t_ds_dag_task_relation_data_df 關係最終表,後續會用於 Nebula Graph,這個後面會講。

②寫一個 Python 指令碼執行上述 SQL

指令碼放在 GitHub上了,run_dep_mysql.py[2]
主要是執行第一步的 SQL。

③告警指令碼:

指令碼放在 GitHub上了,check_dolphin_deps_lost.py[3]
主要是拿 t_ds_dag_task_relation_dep_data_df 這個表的上游工作流code、上游任務code 關聯 t_ds_task_node_base_data 任務資訊表,關聯不上的就是被刪除了或者修改了,要告警出來,提醒使用者。

④告警結果展示!

file
新增了這個依賴巡檢之後,使用者操作導致的依賴缺失問題被解決了,使用者改動任務再也不用擔心了!就算操作失誤,巡檢也會告警出來,提醒使用者及時修復掉。

這個 SQL 放在 Mysql 執行速度很快,對主庫沒什麼壓力,可以把資料實時同步到 Doris ,再做巡檢,也是可以的。

以上就是依賴缺失巡檢的全部內容,如果有任何疑問,都可以與我交流,希望可以幫到你,下次見。

參考資料

[1]

dep_mysql.sql:https://github.com/aikuyun/dolphin_practices/blob/main/dep_mysql.sql

[2]

run_dep_mysql.py:https://github.com/aikuyun/dolphin_practices/blob/main/run_dep_mysql.py

[3]

check_dolphin_deps_lost.py:https://github.com/aikuyun/dolphin_practices/blob/main/check_dolphin_deps_lost.py

本文由 白鯨開源 提供釋出支援!

相關文章