Apache DolphinScheduler + OceanBase,搭建分散式大資料排程平臺的實踐

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

本文整理自白鯨開源聯合創始人,Apache DolphinScheduler PMC Chair,Apache Foundation Member 代立冬的演講。主要介紹了DolphinScheduler及其架構、DolphinScheduler與OceanBase 的聯合大資料方案。

DolphinScheduler是什麼?

Apache DolphinScheduler,作為一款雲原生且配備強大的視覺化介面的大資料工作流排程平臺,可幫助使用者簡化資料工作流的編排過程,透過高效解決複雜大資料任務間的依賴與觸發難題,確保各類大資料任務能夠即插即用,融入各類資料分析與資料探勘場景中,提供全流程視覺化操作能力。

目前,已有超過6000家公司在其生產環境中成功部署並應用了Apache DolphinScheduler。

Apache DolphinScheduler UI 介面

Apache DolphinScheduler 排程平臺具備簡單易用、架構設計上保證系統高可靠性、高擴充套件性和雲原生能力,擁有豐富的使用場景。

  • 高可靠性
    • 架構設計上,去中心化的多 Master 和多 Worker , 具備高可用能力。
    • 採用任務佇列避免過載,不會造成機器卡死。
  • 簡單易用
    • 擁有一鍵部署能力,簡化部署,易維護。
    • 視覺化介面,所有流程定義都是視覺化,透過拖拽任務形成工作流模板。
    • 支援 Open API 、Python 方式與第三方系統對接。
  • ·高擴充套件性、雲原生能力
    • 支援自定義任務型別。
    • 排程能力隨叢集線性增長。
    • 彈性伸縮, Master 和 Worker 支援動態上下線。
  • 豐富的使用場景
    • 支援暫停恢復及停止等豐富操作。
    • 支援多租戶,許可權管理等大資料應用場景。
    • 支援 30+ 種任務型別,如 Spark, Flink,Hive, MR, Python, Shell 等。

從 Apache DolphinScheduler 排程平臺介面能夠看出來,DolphinScheduler 會實時關注任務執行狀態,同時,可以直觀地看到每個工作流的每個環節,可以輕鬆線上回溯任務狀態。

DolphinSchedule 排程平臺採用外掛式設計,支援多資料來源格式,如OceanBase、MySQL、PostgerSQL、Hive、Impala、Spark、ClickHouse、Oracle、SQLServer、Db2、MongoDB 等視覺化的資料來源,並支援自由擴充套件資料來源、支援視覺化配置。方便資料來源統一集中管理,一次配置,到處使用,大大減少配置修改帶來的工作量,也方便後續資料血緣關係的處理。

同時,DolphinSchedule 支援多資料來源資料的加工、資料匯入指令碼統一管理,包括 Python、Shell、Jar 包、R 等多種格式。多層級結構確保檔案管理層次清晰,不用考慮後續檔案應該儲存在哪一臺機器上,避免資原始檔散亂難以維護。

Apache DolphinScheduler 排程平臺

此外,DolphinSchedule 排程系統也十分靈活,滿足多種業務場景需要,工作流流程支援多策略啟動、優先順序、告警配置,任務流程多策略支援確保 ETL 過程可管理:

  • 支援任務失敗策略選擇,失敗繼續或結束。

  • 支援多種通知策略,包括失敗傳送通知、成功傳送通知、全部通知、全部不發通知。

  • 支援優先順序設定,確保高優先順序流程優先執行。

  • 支援選定節點執行 ETL 任務流。

  • 支援序列與並行兩種執行方式。

架構解析

下圖是 Dolphinscheduler 的架構圖,最上面的 UI 是使用者可以感受到的介面, Open API 可以給 UI 提供呼叫介面,也方便第三方對接。

對於 Open API 這一層,排程最關鍵的是 MasterSever 和 WorkerSever ,MasterSever 的職責是分配任務,WorkerSever 的職責是接受 MasterSever 分的任務,然後執行,最後把執行結果彙報給 MasterSever。

由於擔心所有的壓力都集中在 Active MasterSever 上,因此做了無中心化的設計架構。

ApacheDolphin Scheduler 架構

在最初的架構設計中,MasterSever 和 WorkerSever 完全隔離,WorkerSever 拿到任務之後,把任務更新到資料庫裡面,導致 WorkerSever 對於資料庫造成的壓力非常大。

比如聯通把省公司的資料都彙總到資料中心,有一百多臺的 WorkerSever 節點,WorkerSever 又做了資料庫的連線池,資料庫的壓力會非常大。

WorkerSever 負責執行各種工作流,這也是排程系統經常會用到的,我們希望工作流和工作流之間是有設計方法的,比如數倉按照數倉的分層原則,一層一層之間十分地清晰。

此外,我們有一個依賴型別,這個依賴可以跨專案、跨工作流去依賴其他不同頻度的任務,比如說一個天任務,依賴一個小時的任務,這裡有一個依賴節點就可以了。

整體上有一個註冊中心,WorkerSever 都可以接受註冊,WorkerSever 掛了,MasterSever 恢復,MasterSever 掛了,有其他的 MasterSever 監聽到,其他的 MasterSever 接受它的工作流,進行故障 MasterSever 恢復。

MasterSever 1.0 時代的設計是無中心化的,遇到的問題是如何讓 MasterSever 同時工作。我們先設計了一個簡單的方式,先搶鎖,然後去工作,跟蹤的時候發現 Zookeeper 去充當鎖,或是 MasterSever 去充當鎖,搶鎖的時間需要 50 -60 ms,非常慢。

於是,我們又做了設計上的最佳化,首先是搶鎖,搶到鎖之後,把整個工作流介面做成一個圖,然後去構建工作流,最終再把每個執行的任務形成任務例項。

這是 1.0 時代的設計,後來發現效能比較低。

1.X版本設計

在 Dolphinscheduler 2.0 時開始找分散式鎖,我們根據 MasterSever 的演算法,支援多種擴充,來找到它們的槽位。

先去做分片,註冊 MasterSever 會生成一個分片編號,Command 是執行的工作流,在去分散式鎖的時候進行了這樣的一個設計,根據槽位查詢資料庫,然後會生產工作流的例項,交給 Worker 執行,根據分片的槽位去計算。

去分散式鎖設計

1.0 版本對執行緒的使用非常重,縱使是 8C16G 的機器也需要配置幾百個執行緒。

在 2.0 時代,我們進行了線性模式的拆分、改造。MasterSchedulerService ThreadPool 負責從 Command 表中分片獲取要執行的 Command, 構造工作流例項,拆分待執行任務,生成任務例項,提交任務佇列,啟動WorkFlowExecuteThread處理。

WorkFlowExecuteThread工具,負責構建 DAG, DAG 拆分,生成任務例項,提交到任務佇列;

同時負責處理任務狀態和工作流狀態變化,還負責任務/工作流超時監控。

新版本的 Master 端有那些變化呢?

  • 大幅減少 Master 的執行緒使用。
  • 使用分片機制獲取命令佇列。
  • 增加狀態事件的處理機制。
  • 增加 Master 與 Master 之間的通訊,一個 MasterSever 掛了之後,其他的 MasterSever 會互相的通訊。
  • 增加 Master 的緩衝機制,不僅僅是在 MasterSever,在 IPASever上也增加了快取。

Master 執行緒模型重構—2.X 版本設計

做了系統的架構改造之後,吞吐量提升了 20 倍

當然到了 3.0 版本,提升的倍數更多了。隨著架構的演進,吞吐量會有更大的提升。

這也是開源有意思的地方:大家都可以提出自己的想法,把開源最新的思想在專案中實現,並被成千上萬的使用者使用,在使用中完善專案,這就是開源最大的魅力。

改造後的架構效果—吞吐 20 倍提升

Dolphinscheduler & OceanBase 解決方案

下圖是 Dolphinscheduler 和 OceanBase 的解決方案,架構分為三層:

  • 底層是各種檔案系統;
  • 中間層是分析引擎如 Spark、Flink、Hive;
  • 上層是應用層;

從儲存到採集、計算,到轉化,一直到 BI,最後到看到結果的資料,充當了一個箭頭的作用。

DolphinScheduler + OceanBase 解決方案

Dolphinscheduler基於 OceanBase 高可用、低成本、高擴充套件、高效能特性有了一些學習和思考。

由於OceanBase 基於 Paxos 協議保證強一致性,因此我們在做分佈事務的時候,資料強一致性以及不重、不丟都是必須要保證的。

另外我們非常看好OceanBase 的一些特性,比如在擴容時,自動實現負載均衡;再比如低成本,無需太多元件,並且可以隨時玩起來。

那麼,OceanBase 在 DolphinScheduler 裡發揮了什麼作用呢?

首先,作為 DolphinScheduler 的資料來源,方便使用者更簡單快捷建立 SQL 任務。

資料儲存在 OceanBase 裡,簡化資料工作流處理,方便把整個工作流串聯起來,用 SQL 進行處理,所以我們對於 SQL 也做了很多的最佳化,包括執行多少個 SQL,做了很多的設計。

得益於 OceanBase 資料來源的高擴充套件能力,結合 OceanBase 高壓縮比的低成本優勢,讓使用者在大規模使用時受益。

其次,作為 DolphinScheduler 後設資料基礎依賴,存放 DolphinScheduler 本身的各項關鍵資訊。

Dolphinscheduler 底層的表資料量增量非常快,但是排程的任務一般不能刪,需要儲存一兩年資料的時候,整體資料量相當複雜,原來嘗試使用普通表儲存,但是彙總資料的時候很麻煩。

現在我們用一個分散式資料庫儲存,讓 OceanBase 充當後設資料庫,保證排程系統的穩定性。當然,在穩定性上我們會慎之又慎,需要做很多的穩定性測試,也希望有更多的社群小夥伴可以加入共同測試。

Apache DolphinScheduler Use Case

Dolphinscheduler 在海內外擁有豐富的使用者基礎,如中國聯通、Shein、荔枝 PM、360 等,希望Dolphinscheduler 排程系統能為更多的使用者帶來便利。

Dolphinscheduler 有一個很出名的口號:工具選的好、下班回家早、排程用的對,半夜安心睡。希望排程系統和 AI 的結合,可以為大家的業務賦能,為大家的身體鬆綁。

讓中國的開源真正地走向全球,讓更多人知道中國的開源專案也很厲害,是我們的願景。歡迎大家參與到社群討論和共建裡來,參與到中國開源專案的建設中來。

附:

  • OceanBase GitHub專案地址:https://github.com/oceanbase/oceanbase
  • Dolphinscheduler 專案地址:https://github.com/apache/dolphinscheduler*
  • Dolphinscheduler 官網: https://dolphinscheduler.apache.org

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

相關文章