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