Apache DolphinScheduler新一代分散式工作流任務排程平臺實戰-上

2022-07-30 09:00:37

概述

定義

dolphinscheduler 官網地址 https://dolphinscheduler.apache.org/

dolphinscheduler GitHub地址 https://github.com/apache/dolphinscheduler

Apache DolphinScheduler是一個分散式去中心化,易擴充套件的視覺化DAG工作流任務排程平臺。致力於解決資料處理流程中錯綜複雜的依賴關係,不能直觀監控任務健康狀態等問題,使排程系統在資料處理流程中開箱即用;以DAG流式的方式將Task組裝起來,可實時監控任務的執行狀態,同時支援重試、從指定節點恢復失敗、暫停及Kill任務等操作。

特性

  • 高可靠性:去中心化的多Master和多Worker服務對等架構, 避免單Master壓力過大,另外採用任務緩衝佇列來避免過載。實現叢集HA,通過Zookeeper實現Master叢集和Worker叢集去中心化。
  • 簡單易用:DAG監控介面,所有流程定義都是視覺化,通過拖拽任務完成客製化DAG,通過API方式與第三方系統整合, 一鍵部署。以DAG圖的方式將Task按照任務的依賴關係關聯起來,可實時視覺化監控任務的執行狀態。
  • 豐富的使用場景:支援多租戶,支援工作流定時排程、依賴排程、手動排程、手動暫停/停止/恢復,同時支援失敗重試/告警、從指定節點恢復失敗、Kill任務等操作。
  • 高擴充套件性:支援自定義任務型別,排程器使用分散式排程,排程能力隨叢集線性增長,Master和Worker支援動態上下線。
  • 緊密貼合巨量資料生態,支援豐富的任務型別,提供Flink、Spark、 Hive, M/R、Python、Sub_process、SQL(mysql、postgresql、hive、sparksql)、Shell等近20種任務型別。
  • 支援工作流優先順序、任務優先順序及任務的故障轉移及任務超時告警/失敗。
  • 支援工作流全域性引數及節點自定義引數設定。
  • 支援資原始檔的線上上傳/下載,管理等,支援線上檔案建立、編輯。
  • 支援任務紀錄檔線上檢視及捲動、線上下載紀錄檔等。
  • 支援對Master/Worker cpu load,memory,cpu線上檢視。
  • 支援工作流執行歷史樹形/甘特圖展示、支援任務狀態統計、流程狀態統計。
  • 支援補數。
  • 支援國際化。

名詞

  • DAG: 全稱 Directed Acyclic Graph,簡稱 DAG。工作流中的 Task 任務以有向無環圖的形式組裝起來,從入度為零的節點進行拓撲遍歷,直到無後繼節點為止。
  • 流程定義:通過拖拽任務節點並建立任務節點的關聯所形成的視覺化DAG
  • 流程範例:流程範例是流程定義的範例化,可以通過手動啟動或定時排程生成,流程定義每執行一次,產生一個流程範例。
  • 任務範例:任務範例是流程定義中任務節點的範例化,標識著具體的任務執行狀態。
  • 任務型別:目前支援有 SHELL、SQL、SUB_PROCESS(子流程)、PROCEDURE、MR、SPARK、PYTHON、DEPENDENT(依賴),同時計劃支援動態外掛擴充套件,注意:其中子 SUB_PROCESS 也是一個單獨的流程定義,是可以單獨啟動執行的。
  • 排程方式:系統支援基於 cron 表示式的定時排程和手動排程。命令型別支援:啟動工作流、從當前節點開始執行、恢復被容錯的工作流、恢復暫停流程、從失敗節點開始執行、補數、定時、重跑、暫停、停止、恢復等待執行緒。 其中 恢復被容錯的工作流恢復等待執行緒 兩種命令型別是由排程內部控制使用,外部無法呼叫。
  • 定時排程:系統採用 quartz 分散式排程器,並同時支援cron表示式視覺化的生成。
  • 依賴:系統不單單支援 DAG 簡單的前驅和後繼節點之間的依賴,同時還提供任務依賴節點,支援流程間的自定義任務依賴
  • 優先順序 :支援流程範例和任務範例的優先順序,如果流程範例和任務範例的優先順序不設定,則預設是先進先出。
  • 郵件告警:支援 SQL任務 查詢結果郵件傳送,流程範例執行結果郵件告警及容錯告警通知。
  • 失敗策略:對於並行執行的任務,如果有任務失敗,提供兩種失敗策略處理方式,繼續是指不管並行執行任務的狀態,直到流程失敗結束。結束是指一旦發現失敗任務,則同時Kill掉正在執行的並行任務,流程失敗結束。
  • 補數:補歷史資料,支援區間並行和序列兩種補數方式。

模組組成

  • dolphinscheduler-alert 告警模組,提供 AlertServer 服務。
  • dolphinscheduler-api web應用模組,提供 ApiServer 服務。
  • dolphinscheduler-common 通用的常數列舉、工具類、資料結構或者基礎類別
  • dolphinscheduler-dao 提供資料庫存取等操作。
  • dolphinscheduler-remote 基於 netty 的使用者端、伺服器端
  • dolphinscheduler-server MasterServer 和 WorkerServer 服務
  • dolphinscheduler-service service模組,包含Quartz、Zookeeper、紀錄檔使用者端存取服務,便於server模組和api模組呼叫
  • dolphinscheduler-ui 前端模組

部署

建議設定

Linux 作業系統版本要求:

作業系統 版本
Red Hat Enterprise Linux 7.0 及以上
CentOS 7.0 及以上
Oracle Enterprise Linux 7.0 及以上
Ubuntu LTS 16.04 及以上

伺服器建議設定:DolphinScheduler 支援執行在 Intel x86-64 架構的 64 位通用硬體伺服器平臺。對生產環境的伺服器硬體設定有以下建議:

CPU 記憶體 硬碟型別 網路 範例數量
4核+ 8 GB+ SAS 千兆網路卡 1+

注意:

  • 以上建議設定為部署 DolphinScheduler 的最低設定,生產環境強烈推薦使用更高的設定
  • 硬碟大小設定建議 50GB+ ,系統磁碟和資料盤分開

網路要求,DolphinScheduler正常執行提供如下的網路埠設定:

元件 預設埠 說明
MasterServer 5678 非通訊埠,只需本機埠不衝突即可
WorkerServer 1234 非通訊埠,只需本機埠不衝突即可
ApiApplicationServer 12345 提供後端通訊埠

注意:

  • MasterServer 和 WorkerServer 不需要開啟網路間通訊,只需本機埠不衝突即可
  • 管理員可根據實際環境中 DolphinScheduler 元件部署方案,在網路側和主機側開放相關埠

使用者端 Web 瀏覽器要求:DolphinScheduler 推薦 Chrome 以及使用 Chromium 核心的較新版本瀏覽器存取前端視覺化操作介面

下載

如果是簡單體驗 DolphinScheduler 的功能則使用Standalone方式介面,這裡可以使用二進位制也可以docker方式安裝;如果想體驗更完整的功能或者更大的任務量推薦使用偽叢集部署,這裡可以使用二進位制也可以docker-compose方式安裝;如果你是在生產中使用,推薦使用叢集部署或者kubernetes;我們這裡則選擇更好理解其架構和組成的二進位制叢集部署方式。

# 下載最新版本3.0.0-beta-2,也可以選擇2.0.6
wget https://dlcdn.apache.org/dolphinscheduler/3.0.0-beta-2/apache-dolphinscheduler-3.0.0-beta-2-bin.tar.gz
# 解壓檔案
tar -xvf apache-dolphinscheduler-3.0.0-beta-2-bin.tar.gz

部署規劃

準備三臺伺服器安裝叢集,ZooKeeper和MySQL 使用之前文章已部署好的,下面前置準備工作和準備啟動環境都是在三臺上都要執行

前置準備工作

安裝每一臺伺服器都準備下面的前置條件

  • JDK(1.8+)
  • 資料庫:PostgreSQL (8.2.15+) 或者 MySQL (5.7+),兩者任選其一即可,如 MySQL 則需要 JDBC Driver 8.0.16,我們這裡選擇 MySQL。
  • 註冊中心:ZooKeeper (3.4.6+)
  • 程序樹分析
    • macOS安裝pstree
    • Fedora/Red/Hat/CentOS/Ubuntu/Debian安裝psmisc yum -y install psmisc
  • 注意: DolphinScheduler 本身不依賴 Hadoop、Hive、Spark,但如果你執行的任務需要依賴他們,就需要有對應的環境支援。

準備啟動環境

  • 設定使用者免密及許可權:建立部署使用者,並且一定要設定 sudo 免密。以建立 dolphinscheduler 使用者為例:
# 建立使用者需使用 root 登入
useradd dolphinscheduler
# 新增密碼
echo "dolphinscheduler" | passwd --stdin dolphinscheduler
# 設定 sudo 免密
sed -i '$adolphinscheduler  ALL=(ALL)  NOPASSWD: NOPASSWD: ALL' /etc/sudoers
sed -i 's/Defaults    requirett/#Defaults    requirett/g' /etc/sudoers
# 修改目錄許可權,使得部署使用者對二進位制包解壓後的 apache-dolphinscheduler-*-bin 目錄有操作許可權
chown -R dolphinscheduler:dolphinscheduler apache-dolphinscheduler-*-bin

注意:因為任務執行服務是以 sudo -u {linux-user} 切換不同 linux 使用者的方式來實現多租戶執行作業,所以部署使用者需要有 sudo 許可權,而且是免密的。初學習者不理解的話,完全可以暫時忽略這一點。如果發現 /etc/sudoers 檔案中有 "Defaults requirett" 這行,也請註釋掉。

  • 設定機器SSH免密登陸:由於安裝的時候需要向不同機器傳送資源,所以要求各臺機器間能實現SSH免密登陸。設定免密登陸的步驟如下:
su dolphinscheduler
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
# 在執行install.sh機器上設定連線其他機器的免密
scp ~/.ssh/id_rsa.pub [email protected]:/tmp/dolphinscheduler
scp ~/.ssh/id_rsa.pub [email protected]:/tmp/dolphinscheduler
# 在192.168.5.53和192.168.12.27上執行
cat /tmp/dolphinscheduler/id_rsa.pub >> ~/.ssh/authorized_keys

注意: 設定完成後,可以通過執行命令 ssh localhost 判斷是否成功,如果不需要輸入密碼就能ssh登陸則證明成功。

修改組態檔

完成基礎環境的準備後,需要根據你的機器環境修改組態檔。組態檔可以在目錄 bin/env 中找到,他們分別是 並命名為 install_env.shdolphinscheduler_env.sh

install_env.sh修改內容如下:

ips=${ips:-"192.168.5.52,192.168.5.53,192.168.12.27"}
sshPort=${sshPort:-"22"}
masters=${masters:-"192.168.5.52,192.168.5.53"}
workers=${workers:-"192.168.5.52:default,192.168.5.53:default,192.168.12.27:default"}
alertServer=${alertServer:-"192.168.5.52"}
apiServers=${apiServers:-"192.168.5.53"}
installPath=${installPath:-"/tmp/dolphinscheduler"}
deployUser=${deployUser:-"dolphinscheduler"}
zkRoot=${zkRoot:-"/dolphinscheduler"}

dolphinscheduler_env.sh

  • DolphinScheduler 的資料庫設定。
  • 一些任務型別外部依賴路徑或庫檔案,如 JAVA_HOMESPARK_HOME都是在這裡定義的。
  • 註冊中心zookeeper
  • 伺服器端相關設定,比如快取,時區設定等。

初始化資料庫

DolphinScheduler 後設資料儲存在關係型資料庫中,目前支援 PostgreSQL 和 MySQL,這裡使用 MySQL 8.0.28則需要手動下載 mysql-connector-java 驅動(8.0.28) 並移動到 DolphinScheduler 的 lib目錄下(tools/libs/)。此外其他幾個模組也都需要mysql-connector-java-8.0.28.jar

cp tools/libs/mysql-connector-java-8.0.28.jar master-server
cp tools/libs/mysql-connector-java-8.0.28.jar worker-server/libs/
cp tools/libs/mysql-connector-java-8.0.28.jar alert-server/libs/
cp tools/libs/mysql-connector-java-8.0.28.jar api-server/libs/

設定資料庫和使用者

mysql -uroot -p
mysql> CREATE DATABASE dolphinscheduler DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
# 修改 {user} 和 {password} 為你希望的使用者名稱和密碼
mysql> CREATE USER 'dolphinscheduler'@'%' IDENTIFIED BY 'dolphinscheduler123';
mysql> GRANT ALL PRIVILEGES ON dolphinscheduler.* TO 'dolphinscheduler'@'%';
mysql> CREATE USER 'dolphinscheduler'@'localhost' IDENTIFIED BY 'dolphinscheduler123';
mysql> GRANT ALL PRIVILEGES ON dolphinscheduler.* TO 'dolphinscheduler'@'localhost';
mysql> FLUSH PRIVILEGES;

然後修改./bin/env/dolphinscheduler_env.sh,將username和password改成你在上一步中設定的使用者名稱dolphinscheduler和密碼dolphinscheduler123

export DATABASE=${DATABASE:-mysql}
export SPRING_PROFILES_ACTIVE=${DATABASE}
export SPRING_DATASOURCE_URL="jdbc:mysql://192.168.50.95:3308/dolphinscheduler?useUnicode=true&characterEncoding=UTF-8&useSSL=false&allowPublicKeyRetrieval=true"
export SPRING_DATASOURCE_USERNAME=dolphinscheduler
export SPRING_DATASOURCE_PASSWORD=dolphinscheduler123

完成上述步驟後已為 DolphinScheduler 建立一個新資料庫,現在可以通過快速的 Shell 指令碼來初始化資料庫

sh tools/bin/upgrade-schema.sh

執行後我們檢視dolphinscheduler資料庫,部分表如下

啟動 DolphinScheduler

使用上面建立的部署使用者dolphinscheduler執行以下命令完成部署,部署後的執行紀錄檔將存放在 logs 資料夾內

sh ./bin/install.sh

檢視結果已經成功啟動整個叢集,每一臺都執行設定模組部分

瀏覽器存取地址 http://192.168.5.53:12345/dolphinscheduler/ui 即可登入系統UI。webUi 在org.apache.dolphinscheduler.api.ApiApplicationServer部署的機器是哪個,預設的使用者名稱和密碼是 admin/dolphinscheduler123 ,登入後進入首頁,首頁包含使用者所有專案的任務狀態統計、流程狀態統計、工作流定義統計。DolphinScheduler 支援兩種型別的內建主題,包括 DarkLight。當您想改變主題時,只需單擊頂部控制欄在 語言 左側名為 Dark(or Light) 的按鈕即可。專案首頁包含該專案的任務狀態統計、流程狀態統計、工作流定義統計。這幾個指標的說明如下

  • 任務狀態統計:在指定時間範圍內,統計任務範例中狀態為提交成功、正在執行、準備暫停、暫停、準備停止、停止、失敗、成功、需要容錯、kill、等待執行緒的個數
  • 流程狀態統計:在指定時間範圍內,統計工作流範例中狀態為提交成功、正在執行、準備暫停、暫停、準備停止、停止、失敗、成功、需要容錯、kill、等待執行緒的個數
  • 工作流定義統計:統計使用者建立的工作流定義及管理員授予該使用者的工作流定義

如果需要在某臺伺服器上啟動所有設定的服務或者某個服務

# 一鍵停止叢集所有服務
sh ./bin/stop-all.sh
# 一鍵開啟叢集所有服務
sh ./bin/start-all.sh
# 啟停 Master
sh ./bin/dolphinscheduler-daemon.sh stop master-server
sh ./bin/dolphinscheduler-daemon.sh start master-server
# 啟停 Worker
sh ./bin/dolphinscheduler-daemon.sh start worker-server
sh ./bin/dolphinscheduler-daemon.sh stop worker-server
# 啟停 Api
sh ./bin/dolphinscheduler-daemon.sh start api-server
sh ./bin/dolphinscheduler-daemon.sh stop api-server
# 啟停 Alert
sh ./bin/dolphinscheduler-daemon.sh start alert-server
sh ./bin/dolphinscheduler-daemon.sh stop alert-server

實戰使用

監控中心

可以檢視當前Master、Worker、DB的系統情況,包括CPU、記憶體和平均負載

安全中心

安全中心只有管理員賬戶才有許可權操作,分別有佇列管理、租戶管理、使用者管理、告警組管理、worker分組管理、令牌管理等功能,在使用者管理模組可以對資源、資料來源、專案等授權。接下來先挑幾個必要功能操作下

新增租戶

  • 租戶對應的是 Linux 的使用者,用於 worker 提交作業所使用的使用者。如果 linux 沒有這個使用者,則會導致任務執行失敗。你可以通過修改 worker.properties 組態檔中引數 worker.tenant.auto.create=true 實現當 linux 使用者不存在時自動建立該使用者。worker.tenant.auto.create=true 引數會要求 worker 可以免密執行 sudo 命令
  • 租戶編碼:租戶編碼是 Linux上 的使用者,唯一,不能重複

新增使用者

  • 使用者分為管理員使用者普通使用者
    • 管理員有授權和使用者管理等許可權,沒有建立專案和工作流定義的操作的許可權。
    • 普通使用者可以建立專案和對工作流定義的建立,編輯,執行等操作。
    • 注意:如果該使用者切換了租戶,則該使用者所在租戶下所有資源將複製到切換的新租戶下。
  • 編輯使用者資訊
    • 普通使用者登入後,點選使用者名稱下拉框中的使用者資訊,進入使用者資訊頁面,點選"編輯"按鈕,編輯使用者資訊。
  • 修改使用者密碼
    • 普通使用者登入後,點選使用者名稱下拉框中的使用者資訊,進入修改密碼頁面,輸入密碼並確認密碼後點選"編輯"按鈕,則修改密碼成功。

Worker分組

每個 worker 節點都會歸屬於自己的 worker 分組,預設分組為 default。在任務執行時,可以將任務分配給指定 worker 分組,最終由該組中的 worker 節點執行該任務。

  • 開啟要設定分組的 worker 節點上的 conf/worker.properties 組態檔. 修改 worker.groups 引數.
  • worker.groups 引數後面對應的為該 worker 節點對應的分組名稱,預設為 default。
  • 也可以在執行中修改 worker 所屬的 worker 分組,如果修改成功,worker 就會使用這個新建的分組,忽略 worker.properties 中的設定。
worker:
  groups:
    - default
    - bigdatabase

預設有一個default組,三臺Worker節點都在這個組裡

新建一個巨量資料基礎工作組,選擇Worker,確定即可。

專案管理

專案列表

登出退出系統後用前面建立的普通使用者testuser重新登入系統,切換到專案管理模組,點選「建立專案」按鈕,輸入專案名稱,專案描述,點選「提交」,建立演示專案

本篇最後我們就以一個簡單執行多個依賴的shell指令碼的工作流來揭開使用的大門。

工作流定義

進入工作流定義頁面,點選「建立工作流」按鈕,進入工作流DAG編輯頁面,工具列中拖拽 [外連圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-TVT7yVWw-1659111362070)(shell.png)] 到畫板中,新增一個Shell任務,如下圖所示

  • 新增 Shell 任務的引數設定:
    1. 填寫「節點名稱」,「描述」,「指令碼」欄位;
    2. 「執行標誌」勾選「正常」,若勾選「禁止執行」,執行工作流不會執行該任務;
    3. 選擇「任務優先順序」:當 worker 執行緒數不足時,級別高的任務在執行佇列中會優先執行,相同優先順序的任務按照先進先出的順序執行;
    4. 超時告警(非必選):勾選超時告警、超時失敗,填寫「超時時長」,當任務執行時間超過超時時長,會傳送告警郵件並且任務超時失敗;
    5. 資源(非必選)。資原始檔是資源中心->檔案管理頁面建立或上傳的檔案,如檔名為 test.sh,指令碼中呼叫資源命令為 sh test.sh
    6. 自定義引數(非必填);
    7. 點選"確認新增"按鈕,儲存任務設定。

其餘兩個節點也相同建立方式,建立後通過拖拉編排任務的依賴關係,也可以選擇任務節點後選擇前置任務;設定任務之間的依賴關係: 點選任務節點的右側加號連線任務;如下圖所示,任務 shell-nodeA 和任務shell-nodeB 並行執行,當任務shell-nodeA和任務shell-nodeB執行完shell-nodeC會同時執行。如要刪除依賴關係: 點選右上角"箭頭"圖示[外連圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-QUQtvl6n-1659111362085)(arrow.png)],選中連線線,點選右上角"刪除"圖示[外連圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-vIJI4yCV-1659111362088)(delete.png)],刪除任務間的依賴關係。

儲存工作流定義: 點選」儲存「按鈕,彈出"設定DAG圖名稱"彈框,如下圖所示,輸入工作流定義名稱,工作流定義描述,設定全域性引數(選填),點選"新增"按鈕,工作流定義建立成功。


進入工作流定義頁面,工作流定義列表的操作功能如下:

  • 編輯: 只能編輯"下線"的工作流定義。工作流DAG編輯同建立工作流定義。
  • 上線: 工作流狀態為"下線"時,上線工作流,只有"上線"狀態的工作流能執行,但不能編輯。
  • 下線: 工作流狀態為"上線"時,下線工作流,下線狀態的工作流可以編輯,但不能執行。
  • 執行: 只有上線的工作流能執行。執行操作步驟見執行工作流
  • 定時: 只有上線的工作流能設定定時,系統自動定時排程工作流執行。建立定時後的狀態為"下線",需在定時管理頁面上線定時才生效。定時操作步驟見工作流定時
  • 定時管理: 定時管理頁面可編輯、上線/下線、刪除定時。
  • 刪除: 刪除工作流定義。在同一個專案中,只能刪除自己建立的工作流定義,其他使用者的工作流定義不能進行刪除,如果需要刪除請聯絡建立使用者或者管理員。
  • 下載: 下載工作流定義到本地。
  • 樹形圖: 以樹形結構展示任務節點的型別及任務狀態,如下圖所示:

通過如下操作執行工作流,生成工作流範例

工作流範例可以點選重跑按鈕

檢視任務定義

檢視任務範例,我們重跑了一次因此任務範例有6個

可以多次繼續重跑,在任務範例列表操作按鈕還可以檢視紀錄檔和下載紀錄檔

**本人部落格網站 **IT小神 www.itxiaoshen.com