更多技術交流、求職機會,歡迎關注位元組跳動資料平臺微信公眾號,並進入官方交流群
範例 DAG 介紹
DataLeap 是火山引擎自研的一站式巨量資料中臺解決方案,集資料整合、開發、運維、治理、資產管理能力於一身的巨量資料研發治理套件。在平臺中,一個核心的功能為任務的排程,會根據任務設定的排程頻率(月級,日級,小時級等)執行任務,從而生成對應的範例。
在數倉研發中,不同的表之間會存在依賴關係,而產生表資料的任務範例,也會因此存在依賴關係。只有在上游範例執行成功、下游範例到達設定的執行時間且資源充足的情況下,下游範例才會開始執行。所以,在日常的任務運維中,常常需要分析範例上下游的執行情況,根據具體的情況對範例進行置成功、重跑等操作。
而如何清晰地展示範例之間的關係,幫助使用者快速地分析整個鏈路的執行情況,並完成問題定位和運維操作,則是範例 DAG 需要解決的問題。下面對比下優化前後的效果。
優化前:
可以看到在複雜鏈路中,將所有節點的關係全部展示出來,導致連線混亂,需要通過不停的拖拽、縮放,才能找到沒有執行的上游節點。
優化後:
通過採用了將節點聚合的形式,簡潔地展示上下游關係。同時,採用了將範例狀態進行分類的形式,提供快捷操作的按鈕,讓使用者可以只關注特定狀態的範例,減少了無用資訊對使用者運維操作的干擾。下面將詳細介紹優化的整體過程。
概念
- 任務:在 DataLeap 資料研發平臺中,對資料執行一系列操作的定義。
- 範例:通過任務設定的執行頻率(月級、天級等)而建立的一個任務的快照。
- DAG:全稱為 Directed Acyclic Graph,指有向無環圖,具備嚴密的拓撲性質,有很強的流程表達能力。
- DAG 佈局:指根據有向無環圖中邊的方向,自動計算節點層級和位置的佈局演演算法。
業務場景
以其中一個場景為例:
對於任務 test_3 在 2022-09-29 的範例進行分析可知。當前範例沒有執行,是由於上游任務 test_2 在 2022-09-29 的範例執行失敗導致的,那麼此時可聯絡上游範例對應的任務的負責人,對範例進行處理(包括但不限於重跑,置成功等操作)。
問題
在當前的範例 DAG 圖中,使用者在實際使用中會碰到如下問題:
-
複雜的範例 DAG 圖無法渲染。
在一些業務方向中,會出現 DAG 圖中有幾千節點。由於資料處理的複雜和採用了 svg 的渲染方案,常常會導致前端瀏覽器的崩潰。
-
同層級節點過多,操作困難。
以下圖為例,在分析上游範例中,是哪個範例沒有執行,導致當前範例沒有執行時,需要通過連續拖拽,才能定位到關注的上游範例。
-
檢視節點依賴時,只能不斷展開,在對不同的上游依賴進行展開時,會導致圖展示混亂。
需求分析
在通過使用者調研及使用過程中發現,使用 DAG 進行分析時主要有以下場景:
-
當前範例已經到達指定執行時間,但是沒有執行。
在這種情況下,使用者關注的是上游沒有執行的範例 / 執行失敗的範例,聯絡上游範例的責任人進行問題定位。
-
當範例已經執行成功,但是完成時間比正常情況下有延遲。
在這種情況下,使用者關注的是上游範例中,最晚完成的範例。從而判斷是否對鏈路進行治理優化。
-
當範例執行失敗,導致下游沒有執行。
在這種情況下,使用者關注的是依賴當前範例的所有下游範例,同時需要對下游範例進行聚合篩選,比如任務的優先順序(代表任務的核心程度),以通知下游範例進行重跑等操作。
結合上面存在的問題可得到,主要原因是由於在複雜鏈路情況下,上述需求比較難滿足。而在舊版的 DAG 中,針對簡單鏈路和複雜鏈路的處理是一致的,為此,我們需要設計解決複雜鏈路場景下的方案。
功能設計
針對上面存在的問題以及對需求的分析,我們可以進行如下的功能實現與設計:
渲染方案替換
將 svg 的渲染方案替換成 canvas 渲染,通過減少頁面中 DOM 的數量,提高前端渲染效能。
不同場景的功能設計
通過上面的需求分析,我們設計了不同的功能模式以滿足不同的需求。
模式名稱
|
功能
|
通用模式
|
分析上游阻塞下游執行的原因、檢視上游最晚完成的範例
|
統計模式
|
對依賴當前範例的所有下游進行分組檢視
|
鏈路模式
|
分析兩個範例之間的鏈路關係
|
通用模式
在通用模式中,使用者關注的是節點上下游的關係,在複雜鏈路中快速找到阻塞節點,同時關注阻塞節點的資訊。
針對複雜鏈路,我們設計了多種優化形式:
首先,在同一層的節點超過一定的數量(可自定義)後,所有節點將聚合在一起,我們稱之為聚合節點。這種優化下,可以解決上面提到的由於同一層級節點過多,查詢特定狀態節點不便的問題。也支援點選聚合詳情,通過列表的形式,檢視所有被聚合的節點。並支援篩選,快速查詢到關注的節點並通過展開,恢復與當前節點的依賴關係。
其次,以使用者最關注的範例狀態,對被聚合的節點進行分類,同時新增快捷展開操作。以下圖為例,當前範例處於等待上游依賴完成狀態,在這種情況下,使用者關注的,則是上游沒有開始執行的節點。在聚合節點中,可以清晰地看到存在一個範例,是在等待執行的,點選數位1,即可快速展開範例。
在這個例子中,就將不需要關注的上游成功節點隱藏在列表中,突出圖所需要關注的重點資訊。
同時,為了降低節點展示過多導致圖顯示雜亂的情況,新增了收起功能及跳轉功能。
收起功能是指在通過在聚合節點展開的節點的情況,或是在直接展開上 / 下游的情況下,都支援對某個上游 / 下游節點的整條鏈路收起,方便使用者在瀏覽完一條鏈路後,恢復圖之前的狀態,繼續瀏覽下一條鏈路,減少對後續分析的干擾。
跳轉功能是在檢視當前節點的上游的其他下游,或是下游的其他上游,此時,使用者關注的節點已經轉化為其他的上游 / 下游節點。所以,通過跳轉新頁面的形式,將需要關注的不同節點的上 / 下游資訊區分開,減少在一張圖中展示所有資訊。
並且由於圖中的節點承載資訊的能力有限,在通過點選節點時,會在下方出現與選中範例相關資訊,包括屬性,紀錄檔等,協助使用者運維任務。
統計模式
在統計模式中,使用者關注的是依賴當前節點的下游節點,下游節點則可以分成直接下游和所有下游。所以設計了分層模式和合並模式,在這兩種模式下,可以按照任務的屬性(任務型別 / 範例狀態 / 責任人等)作為分組維度。
分層模式:
合併模式:
鏈路模式
指定上游節點,一鍵展示指定節點與當前節點的鏈路資訊,從而進行精準鏈路分析。
技術實現
資料處理
在原始資料中,是以一個陣列的形式返回節點資訊及依賴關係。所以,需要對資料進行處理形成圖所需要的資料,同時,利用多個 map 對資料進行儲存,方便後續對資料進行檢索,減少時間複雜度。
自定義節點註冊
範例節點的樣式需要通過基礎圖形 Text(文字)、Rect(矩形)、Icon(圖示)進行組合,以達到我們的設計要求。
圖預處理
在前面提到,我們需要在複雜的圖場景中,將超過一定數量的同層節點聚合起來,以達到清晰直觀地傳達圖所要表達的資訊的目的,所以需要對圖的層級及節點進行處理,從而生成聚合節點和去掉多餘的節點。
DAG 圖佈局
通常來說,DAG 的佈局可以按照以下步驟實現。
- 去環:包括自環和非自環,為節點分層做準備。
- 節點分層:給所有節點安排合適的層級。
- 節點排序:同層級內節點排序,減少相鄰層級中節點連續的交叉點數量。
- 節點座標分配:根據分層和同層節點的排序計算節點位置。
而在我們的場景中,節點的層級是有明確含義的,比如在節點 A 處於節點 B 的上方一層,且 A, B 之間有連線連線,則可認為 A 是 B 的上游一層節點。因此與傳統 DAG 佈局產生了以下不同點,我們需要根據場景做客製化。
- 節點所在層級固定:DAG 佈局既能支援自動計算層級,也能接受直接指定節點分層。
-
可能產生同層級連線:將同一層級裡有連線的節點進行分組,進行內部排序後,視為整體再參與當前層級的排序,以減少交叉點的數量。
總結
從功能設計上,我們需要從使用者的使用場景出發,區分不同的功能滿足使用者的訴求。同時,在前端領域中,針對巨量資料量的場景,需要判斷這些巨量資料量的展示對使用者是否存在價值,從巨量資料量中挖掘出使用者的關注點並突出重點,方便使用者快速地進行檢視分析。
從技術實現上,我們需要結合業務,根據業務的特徵去修改已有的 DAG 佈局實現,以滿足在不同的業務場景下,更好地將資訊呈現給使用者。
當然,當前的功能設計也存在不足之處,在當前的上游檢視分析功能上,由於資料庫查詢存在瓶頸,只能分析一層的上游,在後續優化查詢效能後,可以通過一鍵分析,直接查詢到出現問題的根節點,可以幫助使用者減少操作成本以提高分析效率。
參考
關於我們
火山引擎巨量資料研發治理套件DataLeap
一站式資料中臺套件,幫助使用者快速完成資料整合、開發、運維、治理、資產、安全等全套資料中臺建設,幫助資料團隊有效的降低工作成本和資料維護成本、挖掘資料價值、為企業決策提供資料支撐。
歡迎加入位元組跳動資料平臺官方群,進行資料技術交流、獲取更多內容乾貨