DophineSheduler上下游任務之間動態傳參案例及易錯點總結

  • 2022 年 9 月 28 日
  • 筆記

 

作者簡介

淡丹
數倉開發工程師
5年數倉開發經驗,目前主要負責百得利MOBY新車業務
二手車業務及售後服務業務系統數倉建設
 

業務需求

在ETL任務之間調度時,我們有的時候會需要將上游的計算結果作為參數傳入到下游,針對這種業務需求,海豚調度器為我們提供了一些功能。
 
具體如下:
DolphinScheduler允許在任務間進行參數傳遞,目前傳遞方向僅支援上游單向傳遞給下游。
支援這個特性的任務類型有:
  • Shell
  • SQL
當定義上游節點時,如果有需要將該節點的結果傳遞給有依賴關係的下游節點,需要在【當前節點設置】的【自定義參數】設置一個方向是 OUT 的變數。
目前我們主要針對 SQL 和 SHELL 節點做了可以向下傳遞參數的功能。

 

SQL任務

步驟1:SQL任務構建
 
測試SQL如下
select label_id,label_name  from (
select "10" as label_id,"客戶" as label_name
  ) t
 
具體如下圖

 
注意點
  1. 方向選擇為 OUT,只有當方向為 OUT 時才會被定義為變數輸出
  2. 數據類型可以根據需要選擇不同數據結構
  3. Value 部分不需要填寫
  4. 參數名字一定要和欄位名字對應,否則不會識別
如果 SQL 節點的結果為多行,一個或多個欄位,參數的名字需要和欄位名稱一致。
數據類型選擇為LIST。獲取到 SQL 查詢結果後會將對應列轉化為 LIST,並將該結果轉化為 JSON 後作為對應變數的值。(注意新版本才會有,低版本沒有LIST結構)
 
步驟2:SHELL腳本測試

注意此處,輸入參數不需要填寫,下游直接引用上游的變數即可
 
步驟3:上線驗證結果
查看結果日誌,可以看到下游節點已經接收到參數

 

SHELL任務

先看官網說明(鏈接):
//dolphinscheduler.apache.org/zh-cn/docs/latest/user_doc/guide/parameter/context.html
 
  1. prop 為用戶指定;
  2. 方向選擇為 OUT,只有當方向為 OUT 時才會被定義為變數輸出;
  3. 數據類型可以根據需要選擇不同數據結構;
  4. value 部分不需要填寫;
 
用戶需要傳遞參數,在定義 shell 腳本時,需要輸出格式為 ${setValue(key=value)} 的語句,key 為對應參數的 prop,value 為該參數的值。
 
例如下圖

SHELL 節點定義的時候

日誌檢測到 ${setValue(key=value1)} 的格式時,會將 value1 賦值給 key,下游節點便可以直接使用變數 key 的值。
同樣,您可以在【工作流實例】頁面,找到對應的節點實例,便可以查看該變數的值。
 

 
但在實際使用中官網的例子是跑不通的,這裡面有小坑,上述在使用 ${setValue(key=value)} 這種形式傳參的時候必須用引號引起來。
 
如下才能成功
echo '${setValue(key=value)}'

  

案例所示

上線執行後查看日誌如下:
 

可以看到結果已經列印出來。
如果取掉單引號會報如下錯誤:語法上就無法通過
 

所以在SHELL中傳參的時候,根據給的固定語法前,必須得加上單引號,否則語法無法通過。
上述的例子也僅僅是 Key 後面跟的常量參數,事實上我們往往都是需要動態傳參數的,所以 SHELL 的這種靜態傳遞參數給下游其實是沒有意義的,因為如果是靜態的,我們為什麼不選擇in中輸入參數呢?
 
如下圖所示

我們在不同任務之間上下游之間的參數傳遞,往往是需要動態的/上游某個程式碼執行後的結果傳遞給下游。
 
我們不妨來試試這種方式是否可以?根據猜想我們編寫如下案例:
 
任務1:

 
任務2:
 

 

 
查看test2的日誌並未有任何執行結果列印出

 
根據上面的猜測,由於在使用的時候我們整體上加了單引號,又根據shell語法的經驗,所以筆者決定在引用變數的時候再加單引號試試,也就是如下形式:
echo '${setValue(key='$value')}'

  

我們來繼續實驗:
value=`date`
echo $value
echo "-------------start-----------"
echo '${setValue(key='$value')}'
echo "-------------end----------------"

  

查看任務2的執行結果日誌:
 

 
我們看到出現了最終想要的執行結果日誌,也就是說想要動態傳參必須採用如下模式才能成功~
 
echo '${setValue(key='$value')}'

  

注意:在海豚調度器在 3.0.0-beta-1 版本後修復了這一問題,可以更好的支援動態傳參問題,比如動態地獲取現有的本地或 HTTP 資源並獲取設定變數
 
具體使用方法如下:
lines_num=$(wget //raw.githubusercontent.com/apache/dolphinscheduler/dev/README.md -q -O - | wc -l | xargs)
 
echo "#{setValue(set_val_var=${lines_num})}"

  

 

 

總體傳參串聯任務案例

第一步:設置任務輸出參數

 
第二步:獲取第一步參數並列印輸出,且繼續傳參

 
第三步:使用SQL語句獲取第一步傳遞的參數 ,並把結果傳遞給下游。

 
引用參數時候,直接引用自定義輸出參數的 Key 就可以了,比如本案例的 output ,一般採用${output}的形式,具體如下圖所示:
 

第四步:獲取第三步的執行結果參數,並將結果輸出~
 

【注意點】如果是sql任務:sql結尾不要有分號(;)否則會報錯。
 
整體流程如下圖所示

查看最終(郵件結果)如下:
 

 
任務4日誌資訊:可以看到已生成結果資訊
 

小結
本文總結了DophineSheduler上下游任務之間參數傳遞的方法,並對其中的易錯點進行了梳理,同時給出了具體參數傳遞的案例,讀者可自行進行摸索。
 
其中易錯點歸納如下:
(1)參數輸出時方向選擇為 out
(2)sql任務時參數的 key 值一定和 sql 語句中的欄位名保持一致,否則不識別
(3)輸出的value值不需要填寫
(4)shell任務時,具體參考如下模板,模板中注意引號的使用
echo '${setValue(key='$value')}'

  注意此處等號左邊的 key 需要和自定義輸出的參數key 名字一致

(5)sql任務中結尾不要有分號
(6)引用參數時只需要採用${key}即可
 
最後,如果對這個話題感興趣的話,可以進群一起交流溝通,謝謝大家~
最後非常歡迎大家加入 DolphinScheduler 大家庭,融入開源世界!

我們鼓勵任何形式的參與社區,最終成為 Committer 或 PPMC,如:
  • 將遇到的問題通過 GitHub 上 issue 的形式回饋出來。
  • 回答別人遇到的 issue 問題。
  • 幫助完善文檔。
  • 幫助項目增加測試用例。
  • 為程式碼添加註釋。
  • 提交修復 Bug 或者 Feature 的 PR。
  • 發表應用案例實踐、調度流程分析或者與調度相關的技術文章。
  • 幫助推廣 DolphinScheduler,參與技術大會或者 meetup 的分享等。
歡迎加入貢獻的隊伍,加入開源從提交第一個 PR 開始。
  • 比如添加程式碼注釋或找到帶有 」easy to fix」 標記或一些非常簡單的 issue(拼寫錯誤等) 等等,先通過第一個簡單的 PR 熟悉提交流程。
註:貢獻不僅僅限於 PR 哈,對促進項目發展的都是貢獻。
 
相信參與 DolphinScheduler,一定會讓您從開源中受益!
 

參與貢獻

 
隨著中國開源的迅猛崛起,Apache DolphinScheduler 社區迎來蓬勃發展,為了做更好用、易用的調度,真誠歡迎熱愛開源的夥伴加入到開源社區中來,為中國開源崛起獻上一份自己的力量,讓本土開源走向全球。
 
參與 DolphinScheduler 社區有非常多的參與貢獻的方式,包括:
貢獻第一個PR(文檔、程式碼) 我們也希望是簡單的,第一個PR用於熟悉提交的流程和社區協作以及感受社區的友好度。
 
社區匯總了以下適合新手的問題列表://github.com/apache/dolphinscheduler/issues/5689
非新手問題列表://github.com/apache/dolphinscheduler/issues?q=is%3Aopen+is%3Aissue+label%3A%22volunteer+wanted%22
如何參與貢獻鏈接://dolphinscheduler.apache.org/zh-cn/community/development/contribute.html
來吧,DolphinScheduler開源社區需要您的參與,為中國開源崛起添磚加瓦吧,哪怕只是小小的一塊瓦,匯聚起來的力量也是巨大的。
 
來吧,開源社區非常期待您的參與。