Apache DolphinScheduler是基于Apache開源社區理念打造的知名DataOps 領域開源項目。作為一個分布式去中心化,易擴展的可視化工作流任務調度平臺,Apache DolphinScheduler目前已累計在1000多家公司生產環境中作為企業的核心調度系統。在近日的【T·Talk】系列技術分享活動中,Apache Member、Apache DolphinScheduler PMC Chair、白鯨開源聯合創始人代立冬老師詳細介紹了Apache DolphinScheduler架構迭代中的經驗與教訓,并分享了自己對開源的理解與思考。【T·Talk】也將本次分享的精彩內容進行了整理,希望大家喜歡。
?
Apache DolphinScheduler
Apache DolphinScheduler是一個云原生的分布式的工作流調度系統,也是首個由國人主導并貢獻到Apache基金會的大數據工作流調度領域的頂級項目,擁有著每日支持千萬級任務調度的能力。據不完全統計,目前已有一千多家不同領域企業在生產環境上使用Apache DolphinScheduler。

能夠擁有如此多的用戶群體,主要由于Apache DolphinScheduler擁有著以下幾個關鍵優勢:
- 高可靠性:調度最重要的能力是可靠性。Apache DolphinScheduler在架構上采用了去中心化的多Master和多Worker的設計。所有的Master Server都會同時工作,包括Worker也是無中心的。且在這樣的架構下采用了任務隊列機制去避免過負載,這樣可以有效避免機器卡死。
- 簡單易上手:ApacheDolphinScheduler的前身是EasyScheduler,Easy和Simple一直是我們的核心理念。ApacheDolphinScheduler擁有可視化的拖拉拽界面,所有的定義都是通過拖拉拽形成的,同時也有OpenAPI與第三方系統對接。有一些習慣于使用Python的小伙伴,也可以使用PY DolphinScheduler去創建工作流定義。
- 使用場景豐富:ApacheDolphinScheduler能夠支持多租戶、權限管理以及超過20種的常用任務。這一能力是目前很多開源項目,包括一些商業調度系統所不具備的。ApacheDolphinScheduler設計之初的目標就是超越一些商業公司的調度系統。如果開源項目有足夠的價值,足以代替一些商業公司產品。
- 高擴展性:我們希望ApacheDolphinScheduler支持自定義任務類型,目前已實現了SPI化,未來還會使其擁有更好的熱加載能力。Apache DolphinScheduler分布式調度的特性將得到強化,例如擁有更多K8S能力,隨著集群的能力而實現線性增長。擴展性方面,應當具備彈性伸縮的能力,未來也會實現K8S的Operator,Serverless以加大Master的伸縮容。
當然,作為一款開源項目,ApacheDolphinScheduler的每一步發展與成長都離不開社區的貢獻,開源社區的力量是非常強大的。為了能夠讓大家更好地記住ApacheDolphinScheduler,這里也介紹一個社區所貢獻的slogan,那就是“工具選的好,下班回家早。調度用的對,半夜安心睡。"
架構迭代中的經驗與教訓
"優秀的架構不是設計出來的,而是迭代出來的。“這句話在ApacheDolphinScheduler中體現得淋漓盡致。以下是ApacheDolphinScheduler最新的架構。最上端能夠直觀可感知的是UI,UI界面下面則承載著APIServer,如果通過OpenAPI去調ApacheDolphinScheduler,也是通過這樣一個服務接口來調起的。

在此之下還有數個對等的Master Server,Master Server會根據一些算法,例如隨機、輪詢或是基于CPU和內存的線性加權等給Worker分任務,WorkerServer則會在接收任務時響應,并在完成任務時回應Response。大數據調度很重要的特點是很多任務是離線的,任務的運行時間較長,大部分任務都會超過30分鐘甚至幾個小時,所以需要分響應和Response。Master Server和Worker Server都會注冊ZK集群,主要負責服務的注冊、監聽。如果Master或Worker Server掛了,需要恢復,包括一些容錯的機制,以及極個別情況下,會用到分布式鎖。去分布式鎖、減少數據庫輪詢是架構改造的核心目標之一。Master Server在工作時,先搶一把鎖,誰搶到鎖誰工作。這時ZK在充當分布式鎖的過程中,性能是比較低的,對此我們做了去分布式鎖的優化,大幅減少線程的使用。
1.3架構與1.2架構也存在一個明顯的區別,1.3架構在1.2架構的基礎上刪除了TaskQueue。之所以如此設計,是因為越來越多的用戶發現,在任務較多的時候,Worker Server能夠到達上百臺。由于其用TaskQueue做了緩沖,因此會給數據庫造成極大的壓力,僅是維護一個數據庫連接池就有可能都會把數據庫的連接池耗盡。

無論是去分布式鎖還是去TaskQueue,其實都符合架構發展的趨勢。寫代碼是一件很有趣的事情,有時你會發現我們能夠通過寫出新的代碼創造價值,但后來又發現一些不合理的地方,因此要將此前寫出的東西刪掉、優化掉,這其實也是一種價值的體現。架構的迭代、演進亦是如此,是一個不斷做取舍的過程。

在做去分布式鎖時,我們的第一感覺是需要加一個Scheduler,用API去與Scheduler交互,Scheduler接到任務或定時任務后,去分發到每一個Master上。但隨后又考慮到,如果后續的任務較多,其一定會受限于當前的Active的節點本身,例如CPU、內存等一些硬件的設施,就像Hadoop的NameNode、Active的NameNode一樣,會有這樣的壓力。最終我們還是放棄了這樣的架構,雖然當時已經實現了代碼,但依然選擇了進行改進。對每一個Master去做編號,并使其按照哈希的方式獲取任務,這是當時最終選擇的方式,也是去分布式鎖當前的實現方式。查詢到任務,而后再去構建有向無環圖,去生成任務實例,并進行分配任務。
?
云原生時代調度的發展方向其實還有很多,我們希望調度能夠Serverless化、能夠更加容器化、更加彈性化。在架構方面,要去ZK,使其更加穩定、更加健壯。包括支持多云的能力,現在已經有越來越多的公司使用不止一朵云,因此Apache DolphinScheduler也需要有跨云、多云的能力,這方面后續會有更多的支持。彈性的伸縮,任務的隔離性等,都是需要考慮的能力。
如何做一個開源項目
做開源項目的第一要素,是要考慮定位。首先需要了解目前是否有競品或可參考的項目,明確想要做的項目能否解決現有產品沒有解決的痛點。其次是產品定位,這將直接決定項目的天花板。最后,一定要有創新,而不是重復造個輪子。很多用戶以及貢獻者是會去對同類型項目進行比較選擇的,沒有創新將很難得到支持。

第二點,做項目時也要從用戶角度考慮。一定要明確你要解決什么樣的用戶痛點,以及它與其他開源項目有何不同,將這些問題想清楚再動手是不遲的,不走彎路即是快。此外,也需要考慮這一領域的商業公司,我們能否通過開源的方式超越這些商業公司,對方用戶的替換代價有多大,為什么要從其他項目替換到你的項目,這都是需要考慮的。
第三點,一個開源項目有持久的生命力這一點非常重要,簡單來說就是能否解決貢獻者吃飯的問題。目前已經有越來越多的企業將ApacheDolphinScheduler寫在招聘需求中,例如熟悉ApacheDolphinScheduler者優先、貢獻者優先等,這些都是能夠給貢獻者的加分項。貢獻者也是要吃飯的,也有各種各樣訴求,能夠讓貢獻者通過參與開源獲得收益,這非常重要。
當項目初步完成后,則需要去尋找種子用戶,讓用戶作出評價,再去改進,千萬不要閉門造車。在ApacheDolphinScheduler發展的早期,我們真的會手把手教用戶操作,能去企業拜訪就去拜訪,不能拜訪就遠程教學,這樣才找到了第一批種子用戶,大家才愿意去“吃這只螃蟹”。有了種子用戶,才能夠形成口碑,口碑傳播雖然是一個極慢的過程,但卻十分有效。
堅持,也是做開源過程中非常重要的一件事。很多開源項目做不過兩年,這與它的項目作者、創始團隊有很大的關系,但凡有一些雜念,沒有堅持下去,都是非常可惜的。如果你覺得自己的項目很好,一定要堅持下去,在中國做開源很難,要花大量的業余時間與精力在項目上,所需要付出的努力甚至會高于一些商業項目。最后一點,酒香也怕巷子深。大多數開源項目都是開發者做起來的,但很多開發者其實并不是很愿意去宣傳自己的項目,也有一些可能由于表達能力弱一些,不擅長分享。對此的建議是一定要抓住一切機會去推廣、宣傳自己的項目。例如在群中分享,或與別的項目聯合舉辦meetup、去公司試講。這些宣傳與推廣能幫助你的項目收獲更多的用戶與貢獻者。
如何參與一個開源項目
參與開源項目首先是一個很好的提升技術能力的方式,越是頂級的、知名的開源項目,參與的高手越多。通過參與開源我們能夠快速得到技術能力的提升,通過與高手的交流,也能夠收獲更多的技術經驗。

第二點,參與開源,一旦你的代碼被使用,它就會運行在成千上萬的服務器之上,被不同的人、不同的企業使用,這是一件非常令人驕傲的事,會很直接地提升你的自信心與獲得感。
第三點,大家會認可你的貢獻,開源中的一條規則就是"英雄不問出處"。無論你的職位高低、資歷深淺,貢獻多的人,就會被社區認可,就會有影響力,你的聲望就會比較大。
第四點,豐富閱歷。中國是世界上唯一能夠把參與開源寫進簡歷并且會在招聘中作為一個加分項的國家。中國的很多企業為開源人提供了這樣的機會,例如你研究了某一個項目的源碼、對其熟悉,或認識一些項目的貢獻者,遇到問題能夠聯系他們尋求幫助,這會非常有用,這些經歷能夠為你的簡歷加分。
第五點,結交高手。公司畢竟還是一個小圈子,你能夠在公司中認識的人是比較有限的,但是通過開源,你能夠認識全世界的高手。無論對技術發展還是職業發展,這都是有幫助的。
第六點,收獲創新性。參與一些新型的開源項目,能夠了解到目前這一領域可能的創新機會及思路。開源是可以通過創新等力量打破壟斷的,這是已經多次得到過驗證的道理。
關于如何找到一個適合自己的開源項目,很多情況是工作需要,另外個人興趣也是很重要的一點。開源項目的評價標準有很多,但是比較直觀的參考因素就是社區的活躍度。Apache的理念中有一條是“社區大于代碼”,獨行者快,眾行者遠,社區的活躍度代表了這個開源項目到底能走多遠。對開源感興趣的同學,首先可以通過郵件列表訂閱user,若是貢獻者則可以訂閱DEV。做一些非技術性的討論,參加一些meetup,都是參與開源的機會。通過這些渠道你能夠充分了解到這個項目的各個方面信息,也可以確定這個項目是否靠譜。
?
第二點,先在本地使用開源項目,例如SeaTunnel這樣的項目,它是一個Apache基金會孵化的項目,其貢獻者群體也是非常活躍的,這就是一個比較優質的項目。我們去參與其中時,應該先把它先運轉起來、運行起來,去直觀地感受項目的用途以及功能。
第三點,不要憋大招。尤其是在做第一次貢獻的時候,good first issue都是比較簡單的,大家可以通過這個練手。找一些小的issue去fix,然后再慢慢從提交小PR到提交大PR。對于不了解流程的同學,可以去學習貢獻規范,尤其像Apache中的項目,都有非常詳細的指導貢獻的流程文檔。此外,貢獻新生項目,更容易成為Committer,這也是很多小伙伴會去考慮的一點。如果你的目標是成為一個項目的Committer,那么參與一個新的開源的項目,實現這個目標的難度會小很多。例如像SeaTunnel這樣的云原生做數據遷移、數據備份、數據集成的項目,貢獻幾種數據源,成為一個Committer也是有可能的。
思考與前瞻
"社區是一群為了共同利益而聚集到一起的人,做著有意義的事情。"這是《用戶共創》的作者喬諾給大家分享的。開源最佳狀態其實是邊用邊貢獻邊吐槽,這是參與開源的最佳狀態。大家用的過程中吐吐槽,然后再提一個PR,發現項目中不好的地方,再把它fix一下,這才是開源最佳的狀態。
目前有大量的企業都在使用開源,未來很多的基礎軟件,包括一些中間件,都會以開源的形態存在,因此也希望大家能夠更多地參與開源。思考在開源之中自己能夠做哪些事情,是否能夠做更多的貢獻。將開源當成自己職業生涯、自己青春的一部分,去豐富自己的閱歷,為中國的開源軟件事業做出一些貢獻,這是當代青年尤其是程序員應該追求的事情。我們共同的目標應當是立足中國、貢獻全球。





























