![file](https://img2023.cnblogs.com/other/2685289/202307/2685289-20230714100921932-1108940383.jpg) ## 用戶案例 | 自如 隨著自如業務的快速發展,不斷增長的調度任務和歷史逾萬的存量任務對平臺穩定性提 ...
用戶案例 | 自如
隨著自如業務的快速發展,不斷增長的調度任務和歷史逾萬的存量任務對平臺穩定性提出了更高的要求。同時,眾多非專業開發人員也需要一種更為“親民”的調度平臺使用體驗。
如何滿足這些日漸凸顯的需求對自如大數據平臺的開發團隊來說,無疑是巨大的挑戰。團隊經過深入的研究和對比,發現Apache DolphinScheduler是一個能夠滿足自如當前所有核心需求的項目。
至此,團隊開始引入Apache DolphinScheduler,併在此基礎上進行了一系列的改造和優化,其中包括自動生成SQL血緣解析調度,支持Ambari管理Apache DolphinScheduler,以及端到端調度組件的可用性監控等功能,從而更好地滿足企業內需求。
本文將詳細描繪Apache DolphinScheduler在自如中的應用以及演變過程。
作者簡介
陳卓宇,自如大數據平臺運維,負責自如離線數據調度,Apache StreamPark PPMC,Apache DolphinScheduler Contributor
業務挑戰
- 複雜的業務場景:自如的數據處理業務場景豐富多樣,涵蓋了To C和To B的品質居住產品、智慧生活服務、智能家裝家居、智慧社區組織運營四大板塊。
- 大量的歷史存量任務:自如歷史累計的離線任務數量龐大,目前累計離線調度任務已達到1萬+的規模,這對平臺的穩定性提出了非常高的要求。
- 離線任務增量大:目前,自如仍處於業務飛速發展的階段,離線任務的數量持續增長,這對平臺的擴展性和處理能力提出了極高的挑戰。
- 非專業開發人員的易用性需求:自如的數據使用人員主要包括運營人員、分析師、產品BP等非專業開發人員,他們對於配置調度的易用性要求嚴格,需要能支持SQL化操作,以及用戶友好的配置界面,以達到"平民化"的使用體驗。
解決方案
自如對調度技術選型的核心訴求
自如對於調度技術的選型訴求可以從兩個方面進行剖析:一是用戶層面,二是技術運維層面。
在用戶層面,我們的用戶期望平臺能提供:
- 簡單易用的操作方式:使用戶能快速上手,高效地進行需求邏輯開發。
- 豐富的實踐案例:供用戶參考和學習,助力他們更好地理解和使用平臺。
在技術運維層面,我們的開發和運維團隊期望平臺能提供:
- 通用的技術棧:便於進行二次開發,快速地將項目集成到自如的企業生態中。
- 豐富的組件:支持多種多樣的任務類型,滿足各種業務需求。
- 優秀的架構設計:確保項目具有高可用性、易擴展性以及支撐海量任務調度的能力。
- 活躍的開源社區:遇到問題時,團隊能夠便捷且迅速地從社區獲得必要的幫助。
針對上述的核心訴求,自如團隊對行業內的所有相關項目進行了深入的調研,並最終發現,Apache DolphinScheduler是唯一一個能滿足自如團隊所有核心訴求的項目。因此,我們選擇了Apache DolphinScheduler2.0.6版本作為自如的離線調度技術解決方案。
架構設計
目前,自如已經成功地通過內部研發構建了一套可供全集團使用的大數據平臺。為了進一步滿足離線數據倉庫這一垂直領域的需求,自如選擇使用Apache DolphinScheduler進行集成與擴展。這一改進旨在提升整體平臺的能力,從而讓其能夠為集團內的各個業務部門提供更強大的數據加工、數據編排的能力。
如圖所示,數據調度是自如數據開發流程中的第四個環節,屬於整個流程中承上啟下的核心。在流程的上游,如河圖(數據血緣查詢服務)的血緣功能以及Hue的查詢能力,共同為生成SQL業務邏輯提供支持,而數據調度的角色則是編排加工這些SQL邏輯。
在流程的下游,首先是數據質量模塊,該模塊的核心職責是確保調度輸出的準確性,也就是我們所說的"口徑"的確保。通過這一環節,我們保障了數據的質量,為後續步驟提供了可靠的基礎。其次是數據服務化模塊,這個模塊的主要任務在於,對調度結果進行再次的彙總和加工,使其在指標層面上達到我們的預期,並以標準化的Restful服務的形式提供出來,以供用戶使用。
二次開發實踐
血緣解析自動生成調度
如上圖所示,SQL任務節點的複雜性由其涉及的眾多上游依賴表關係可見一斑,近30個表關係互相交織。在這種複雜的依賴關係面前,如果僅由業務人員來完成,他們不僅需要花費大量時間去理解公司相關業務線下表的關聯關係,同時還需掌握DolphinScheduler的配置和使用方式,這對他們來說是一項沉重的負擔。
因此,自如團隊找到了一種新的解決方案:血緣解析自動生成調度。這個方案的核心價值在於,它完全的解放了業務人員,使其從繁瑣的調度配置中脫離出來。僅需提供SQL語句,程式會讀取這個SQL,解析它,得出調度需要的輸入表和輸出表。解析的結果將用於自動生成並配置調度。
如圖所示,用戶只需將在Hue中調試完畢的SQL一鍵同步至調度平臺。在此,只需點擊“解析”按鈕,系統就會自動根據SQL的血緣關係解析到所有相關的依賴項,並根據這些信息自動生成任務的有向無環圖(DAG)。這樣的設計旨在最大限度地簡化用戶的操作步驟,同時確保調度任務的準確性和效率。
所以,原本複雜的配置流程被簡化為用戶提供SQL語句,剩下的全部由系統完成。從而實現業務人員僅需專註於業務需求,高效、簡潔地完成工作,而無需為了應對這些需求困於複雜配置和技術細節。
支持混合的數據依賴和任務依賴
自如內部歷史存量的調度任務有近1萬個,這些任務分散在業務線自研調度、Airflow調度等多個調度平臺上。團隊並不打算將這些歷史存量任務統一的遷移到新的調度平臺上,更傾向於保持現狀,同時滿足新的需求。基於這樣的考慮,自如在DolphinScheduler上設計實現了"數據依賴"功能,使DolphinScheduler支持混合的依賴模式,從而為調度平臺提供更好的相容性。
通過這種方式,DolphinScheduler既能處理"任務依賴",也能處理"數據依賴"。"任務依賴"是指通過檢測任務是否執行成功來觸發工作流執行,而"數據依賴"是通過檢測數據的分區是否產生來判定工作流是否向下執行。這種混合的依賴處理方式使DolphinScheduler能夠將新的任務和業務線間的歷史調度任務進行有效鏈接,形成一個統一、高效的調度體系。
任務依賴重構
DolphinScheduler使用DEPENDENT插件來實現任務間的依賴關係。然而,這裡會存在一個隱藏的問題,即任務間的依賴關係是基於工作流定義的code碼來建立的。當構建一個複雜的基於數倉分層的任務流時,比如ods->dwd->ads->xxxx,如果用戶誤刪了一個最上游的ods任務,並重新創建了該任務,那麼任務之間的依賴關係將無法正確建立,因為儘管任務名稱相同,但是code碼已經改變了。
為瞭解決這個問題,我們對任務依賴機制進行了重構。改為基於任務名稱來建立的依賴關係,併在創建任務時進行規則驗證,確保任務名稱在整個集群中是唯一的。這樣一來,即使用戶誤刪除後重新創建任務,依賴關係仍然能夠正確地掛載上。
通過這個改進,我們確保了任務之間的依賴關係在整個調度系統中的準確性和穩定性。用戶不再需要擔心誤刪而導致依賴關係無法建立的問題。這樣,用戶可以更加自信地構建複雜的任務流,確保任務間的依賴關係正確地被建立和維護。
支持基於配置的調度生成
在實際工作中,我們還會遇到一些用戶不懂SQL,但仍然需要進行數據的加工和使用的需求。為了滿足這部分用戶,我們實現了基於配置的調度生成模式。這種模式的設計思路是讓用戶通過簡單的配置來定義數據加工和處理的流程,而無需編寫複雜的SQL語句。
通過選擇配置,包括表、表關係、篩選條件、目標等信息,我們的平臺可以自動根據用戶所選信息生成相應的SQL語句。然後,根據生成的SQL語句,再進行上述提到的SQL解析和調度配置的步驟,完成調度任務的配置過程。
這種基於配置的調度生成模式,使得不懂SQL語言的用戶也能夠輕鬆完成數據的加工和使用,大大降低了學習和使用的門檻。同時,它也提高了開發效率,減少了出錯的可能性。這樣的設計使得我們能夠更好地覆蓋不同技術水平的用戶,並滿足他們的需求。
Ambari管理DS的支持
- 參數配置統一管理、多版本對比
DolphinScheduler作為一個分散式應用程式,對配置文件的每次修改都需要在各節點之間進行同步。這個過程不僅繁瑣,而且無法追溯歷史變動。特別是對線上服務的配置,一個微小的變動可能就會導致服務的癱瘓。鑒於這些問題,我們的團隊急需一個能提供明確配置項展示、配置回滾以及歷史版本對比等功能的工具。
Ambari為我們提供了這樣的解決方案。因此,我們通過編寫插件,將DolphinScheduler與Ambari進行集成,從而實現對所有配置項的統一管理。這種集成方式不僅減輕了運維人員的工作壓力,還增強了服務的穩定性,為系統的健壯性和可靠性帶來了有力的保證。
配置項統一管理:
配置項修改版本對比:
- 可視化的一鍵集群啟停
在Ambari的管理界面上,用戶可以清晰地查看整個集群的狀態,包括各節點的運行情況。通過簡單的一鍵操作,用戶能夠啟動或停止部署在多個伺服器節點上的整個集群,這使得集群管理更加直觀和便捷。
- 支持自動服務故障“自我修複”
在Ambari平臺上,實現DolphinScheduler服務的“自我修複”非常簡單。只需在平臺上選擇需要被監聽的DolphinScheduler服務,就可以利用Ambari的Service Auto Start功能來輕鬆實現。當DolphinScheduler服務因某些異常情況宕機時,Service Auto Start會自動不斷嘗試重啟服務,從而確保DolphinScheduler服務的高可用性,極大地提高了系統的穩定性。
端到端調度組件可用性監控WatchDog
雖然DolphinScheduler已經擁有了任務容錯機制和高可用機制,但在實際執行過程中,仍需要涉及於很多外部服務,例如Hiveserver2、ClickHouse等。在這種複雜的環境中,對於運維人員來說,其主要目標並不是要求系統一定要100%無故障,而是希望在出現問題時能立即得到響應,從而使運維人員能儘快介入並解決問題。因此,自如開發了一種端到端的全鏈路可用性測試任務—WatchDog。
WatchDog的目標是監控整個調度流程的可用性,一旦發現問題,立即向運維人員發出警報。這樣的設計大大提高了問題的響應速度和系統的穩定性,減輕了運維人員的負擔,也增強了對整個系統運行狀態的控制能力。
內部核心邏輯“埋點”
在實際使用DolphinScheduler(2.0.6版本)的初期,毫不掩飾地說,確實遇到了許多問題。然而,這些問題並沒有使團隊氣餒,因為團隊也充分理解DolphinScheduler作為一個相對年輕的調度產品,出現各種問題是非常正常。因此,我們決定修複這些問題,來確保DolphinScheduler能順利的在自如“安家”。
在這個過程中,遇到了許多挑戰。例如,調度系統在運行時,可能會有成百上千個任務在同一時間並行執行,每個工作流都對應一個線程對象和內置的存儲隊列。此外,還有眾多的後臺線程和遠程Netty通訊觸發流轉等邏輯交織在一起,這些都給問題的定位帶來了很大的困難。
為瞭解決這個問題,我們開發了一個專門的異常註解。用該註解標註方法後,當發生異常時,它會記錄輸入參數、輸出參數、線程名稱、執行時間、所在伺服器節點以及詳細的異常堆棧信息。然後,通過企業微信和電話告警,將這些信息立即通知給運維人員,從而實現問題的及時定位和處理。因此,我們對調度流程的關鍵環節,如啟動、停止、補數、容錯和定時調度,進行了註解覆蓋。這種方法極大地增強了我們對系統運行狀態的控制力,使我們能更快地發現並解決問題。
JVM參數優化監控
JVM調優的關鍵在於尋求一種'平衡',我們通過調整記憶體大小來平衡垃圾回收的頻率與時長。
我們的優化目標是:一,保證服務的吞吐率;二,減少服務的停頓時間。同時,我們對DolphinScheduler中可能存在記憶體泄露的代碼進行了修正,特別是將一些static屬性更改為局部變數,以此來避免記憶體泄漏。這是因為局部變數只在代碼塊中起作用,而static屬性是與類對象相關的。在JVM中,類的卸載條件非常嚴格,我們的應用程式是由系統類載入器載入的,這樣載入的類是不會被卸載的。這就意味著如果將一個對象掛在該類載入器上,該對象就不會被釋放。而相比之下,局部變數在使用後會很快被釋放。因此,我們的目標是避免對JVM進程中的任何集合或重量級對象進行靜態標記。
下麵是我們在JVM參數優化方面所做的JVM配置,供讀者參考:
- XX:+UseG1GC:使用G1垃圾回收器。
- XX:MaxGCPauseMillis=500:設置最大GC暫停時間為500毫秒。
- XX:+PrintGCDetails
- XX:+PrintGCTimeStamps
- XX:+PrintGCCause:列印GC的詳細信息、時間戳和GC原因。
- XX:+UseGCLogFileRotation
- XX:NumberOfGCLogFiles=10
- XX:GCLogFileSize=10M:啟用GC日誌文件的輪轉,保留10個文件,每個文件大小為10兆位元組。
- XX:+HeapDumpOnOutOfMemoryError、
- XX:+HeapDumpBeforeFullGC:在OutOfMemoryError發生時生成堆轉儲文件,併在執行Full GC之前生成堆轉儲文件。
- Xmx16g、-Xms16g:設置堆的最大和初始大小為16GB。
- XX:MetaspaceSize=512m
- XX:MaxMetaspaceSize=512m:設置元空間的初始大小和最大大小為512MB。
此外,我們還通過使用javaAgent來收集JVM相關的指標,並將其上報到Prometheus,以建立更為全面的監控。
許可權管控
我們對調度許可權的管理主要體現在通過控制HQL任務執行隊列來實現。首先,在登錄過程中,調度平臺會通過LDAP對用戶進行驗證。服務端會獲取用戶LDAP所在的部門,並根據部門名稱在調度平臺上建立相應的項目。換言之,用戶在LDAP中的部門將會被映射到DolphinScheduler上的一個項目空間。
其次,每一個項目都會關聯到一個特定的Hive數據源。每個數據源的差異在於它們的隊列設置。由於不同的部門任務會因為關聯到的數據源而提交到相應的Yarn隊列上,這一設定使得各部門的資源使用得以計價和進行有效治理。
通過這種方式,我們確保了調度許可權的嚴謹管控,同時也實現了部門資源的準確計算和高效治理。
用戶收益
- 滿足了業務人員、分析師、產品BP的數據加工和使用需求:通過基於配置的調度生成模式和自動生成SQL的功能,我們能夠滿足那些不懂SQL語言的業務人員、分析師和產品BP的數據加工和使用需求。他們可以通過簡單的配置來定義數據加工流程,而無需編寫複雜的SQL語句。這使得他們能夠快速、輕鬆地完成數據的處理和使用,提高了他們的工作效率。
- 滿足運維人員維護龐雜數據調度的需求:對於運維人員來說,維護龐雜的數據調度任務是一項具有挑戰性的任務。然而,通過我們的調度平臺,運維人員能夠更加方便地管理和維護這些調度任務。平臺提供了可視化的操作界面和豐富的功能,如配置回滾、歷史版本對比等,使得運維人員能夠輕鬆地進行任務的管理和維護。同時,端到端的可用性監控工具WatchDog也能及時發現系統故障,提高了調度系統的穩定性和可靠性。
通過滿足業務人員、分析師、產品BP的數據加工和使用需求,以及運維人員維護龐雜數據調度的需求,我們基於Apache DolphinScheduler 進行升級改造後的調度平臺能夠為各個角色提供全面的支持,促進業務的順利進行和高效運維。
本文由 白鯨開源 提供發佈支持!