dolphinscheduler簡單任務定義及跨節點傳參
轉載請註明出處 https://www.cnblogs.com/funnyzpc/p/16395094.html
寫在前面
dolphinscheduler
是一款非常不錯的排程工具,本文我就簡稱ds啦,可單機可叢集可容器,可排程sql
、儲存過程
、http
、大資料
,也可使用shell
、python
、java
、flink
等語言及工具,功能強大型別豐富,適合各類排程型任務,社群及專案也十分活躍,現在github中已有8.2k的star?
所以,本篇博文開始會逐步講一些ds相關的東西,也期待各位同行能接觸到此並能實際解決一些生產上的問題~?
一.準備工作
閱讀本博文前建議您先閱讀下官方的文件[https://dolphinscheduler.apache.org/zh-cn/docs/latest/user_doc/guide/parameter/context.html)(https://dolphinscheduler.apache.org/zh-cn/docs/latest/user_doc/guide/parameter/context.html)(雖然也會碰到一些坑?)
這裡,先準備下sql表資源,以下為`postgresql`的`sql`指令碼:
(表結構)
CREATE TABLE dolphinscheduler.tmp (
id int4 NOT NULL,
"name" varchar(50) NULL,
"label" varchar(50) NULL,
update_time timestamp NULL,
score int4 NULL,
CONSTRAINT tmp_pkey PRIMARY KEY (id)
);
(表資料)
INSERT INTO tmp (id,"name","label",update_time,score) VALUES
(3,'二狗子','','2022-07-06 21:49:26.872',NULL),
(2,'馬雲雲','',NULL,NULL),
(1,'李思','','2022-07-05 19:54:31.880',85);
因為個人使用的postgresql
的資料庫,如果您是mysql
或者其他資料的使用者,請自行更改以上表和資料並新增到庫中即可
表及資料入庫,請將tmp所屬的庫配置到 ds後臺
->資料來源中心
->建立資料來源
,以下是我的配置,記住,這裡面的所有資料庫配置均遵守所屬資料庫型別的jdbc
的driver
的配置引數,配置完成也會在ds的資料庫生成一條jdbc
的連線地址,這點要明白~
二.簡單的專案建立及說明
因為`ds`的任務是配置在專案下面,所以第一步得新建一個專案,這樣:`ds後臺`->`專案管理`->`建立專案`,這是我建立的,請看:
準備完專案之後,滑鼠點進去,並進入到 工作流定義
選單 頁面,如下圖:
先簡單到解釋下ds
的一點兒基本結構,首先,ds
一般部署在linux
伺服器下,建立任務的使用者需要在admin賬戶
下建立,重要的是建立的每個工作賬戶需要與作業系統使用者一一對應,比如你建立了一個 test 的ds賬戶,那ds所在的伺服器也必須有一個test的賬戶才可行,這是ds
的規則,我沒法解釋為什麼。
每個使用者下(除了admin外)所能建立的排程任務均在各自建立的專案下,每個專案又分為多個任務(工作流定義),一個任務下又可分為多個任務節點,下圖為任務定義:
ok,如果已經準備好以上步驟,下面開始定義一個簡單的排程任務,繼續哈~
三.簡單的引數傳遞
先看錶:
我們先做個簡單的,比如圖中,如果二狗子的本名叫:李思,需要我們取id=1
的name
放到id=3
的label
中,並且更新update_time
-
1.這裡第一步 在工作流定義列表,點選
建立工作流
就進入一個具體的任務(工作流)的定義,同時我們使用的是sql任務
,所以就需要從左側拖動一個sql任務
到畫布中(右側空白處):
因為拖動sql任務
到畫布會自動彈出節點定義,上圖為當前節點的一個定義,重點是:資料來源
、sql型別
、sql語句
,如官方所說,如果將name
傳遞到下游,則需要在自定義引數重定義這個name
為out
方向型別
為varchar
。 -
2.因為傳遞到引數需要寫入到表,這裡我們再定義一個節點,這個節點負責接收上游傳遞到
name
,執行update
時使用這個name
,以下是我的定義:
看到沒,這裡不僅僅要注意sql型別
(sql型別
與sql語句
是一一對應
的,型別不能錯) ,還有就是前置任務一定要選中(上面定義的)node1
節點。
另外,需要注意的是當前任務是上下游傳參,所以在node2
中是直接使用node1
中定義的name
這個引數哈 -
3.定義完成當前任務就需要儲存:點右上角儲存,填寫並儲存後點關閉以退出定義:
-
4.因為定義的任務需要上線了才可執行,所以,在工作流定義列表先點該任務的
黃色按鈕
(任務上線),然後才是點綠色按鈕
(執行任務):
-
5.任務執行成功與否,具體得看任務例項,這是執行
node2節點
的日誌:
順帶再看看資料庫表是否真實成功:
完美?
四.複雜的跨節點傳參
首先看錶:
思考一個問題:可以看到李思
的score
是85
,根據score
應該被評為 B
(>=90的為A)並寫入到label
欄位,該怎麼辦呢,如果這個分數是90分又該怎麼辦呢,如果根本沒有score(分值) 這個任務是不是就不需要更新李思的label(評分)呢?
對於上面問題可以有一些偏門的解決方法,比如在sql
中塞一個異常值
,這樣看似不錯,不過作為排程工具建議還是在condition節點
或者switch節點
處理是最好的,不過就目前我用的2.0.5
版本的ds
對於這兩類任務節點是沒法接收引數
的,這是一個遺憾;遂~個人覺得較好的方式是在寫入節點之前增加一個判斷節點
,將錯誤丟擲(沒有score的)最好~,對於此,我使用了一個shell的中間節點
。
下面是我定義的三個節點:
-
node1節點定義:
-
node2節點定義:
(指令碼內容)
#!/bin/bash
echo "=====>input param start<====="
echo "id=${id}"
echo "score=${score}"
echo "=====>input param end<====="
id=${id}
echo '${setValue(id2='$id')}'
if [ "${score}" -ge "90" ];then
echo '${setValue(label2=level A)}'
echo "level A"
elif [ "${score}" -ge "80" ];then
echo '${setValue(label2=level B)}'
echo "level B"
elif [ "${score}" -ge "60" ];then
echo '${setValue(label2=level C)}'
echo "level C"
elif [ "${score}" -ge "0" ];then
echo '${setValue(label2=F!)}'
echo "F!"
else
echo "NO score ,please check!"
exit 1
fi
-
node3節點
定義:
-
看一眼結果?:
五.中間的坑
對於複雜節點傳引數也碰到一些坑,這些坑大概有這些:
- 1.對於
shell
指令碼不熟悉的,判斷節點其實還是有一些難度的,這是很重要的一點 - 2.
node2
(判斷節點)不能有重複的引數,不管區域性的還是node1
(上一級)傳遞過來的,均不能重複
- 3.因為在
node2
(判斷節點)需要將id
以及label
繼續往下傳(tonode3
),這時候就需要給id
以及label
定義一個對映的out
變數(id2
、label2
) - 4.
node2
中重新設定引數麻煩
,需要在shell
中重新定義變數(id2
、label2
),同時需要在shell任務
內使用拼接的方式賦值(如:echo '${setValue(id2='$id')}'
) - 5.
sql型別
以及不同節點下不同引數時常搞錯,不是任何節點都可以接收上級節點
引數,以及區域性變數
與傳遞變數
以及全域性變數
優先順序區別及可能造成衝突 - 6.ds
列表傳參
(2.0是不可以的)很雞肋
,對於列表傳參
又不能在下一級節點做迴圈賦值
,這點對於ds是有改進的空間的 - 7.等等...
對於
ds
還有很多可擴充套件的地方(因為實際需要),所以我就做了一些二次開發?,後面會聊...大家期待喲?