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


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

文章插圖
? 作者簡介
DophineSheduler上下游任務之間動態傳參案例及易錯點總結

文章插圖
?淡丹 數倉開發工程師5年數倉開發經驗,目前主要負責百得利MOBY新車業務二手車業務及售后服務業務系統數倉建設 業務需求在ETL任務之間調度時,我們有的時候會需要將上游的計算結果作為參數傳入到下游,針對這種業務需求,海豚調度器為我們提供了一些功能 。 具體如下:DolphinScheduler允許在任務間進行參數傳遞,目前傳遞方向僅支持上游單向傳遞給下游 。支持這個特性的任務類型有:
  • Shell
  • SQL
當定義上游節點時,如果有需要將該節點的結果傳遞給有依賴關系的下游節點,需要在【當前節點設置】的【自定義參數】設置一個方向是 OUT 的變量 。目前我們主要針對 SQL 和 SHELL 節點做了可以向下傳遞參數的功能 。SQL任務步驟1:SQL任務構建 測試SQL如下select label_id,label_namefrom (select "10" as label_id,"客戶" as label_name) t 具體如下圖
DophineSheduler上下游任務之間動態傳參案例及易錯點總結

文章插圖
? 注意點
  1. 方向選擇為 OUT , 只有當方向為 OUT 時才會被定義為變量輸出
  2. 數據類型可以根據需要選擇不同數據結構
  3. Value 部分不需要填寫
  4. 參數名字一定要和字段名字對應,否則不會識別
如果 SQL 節點的結果為多行,一個或多個字段,參數的名字需要和字段名稱一致 。數據類型選擇為LIST 。獲取到 SQL 查詢結果后會將對應列轉化為 LIST,并將該結果轉化為 JSON 后作為對應變量的值 。(注意新版本才會有,低版本沒有LIST結構) 步驟2:SHELL腳本測試
DophineSheduler上下游任務之間動態傳參案例及易錯點總結

文章插圖
?注意此處,輸入參數不需要填寫,下游直接引用上游的變量即可 步驟3:上線驗證結果查看結果日志,可以看到下游節點已經接收到參數
DophineSheduler上下游任務之間動態傳參案例及易錯點總結

文章插圖
? SHELL任務先看官網說明(鏈接):https://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 為該參數的值 。 例如下圖
DophineSheduler上下游任務之間動態傳參案例及易錯點總結

文章插圖
?SHELL 節點定義的時候日志檢測到 ${setValue(key=value1)} 的格式時,會將 value1 賦值給 key,下游節點便可以直接使用變量 key 的值 。同樣,您可以在【工作流實例】頁面,找到對應的節點實例,便可以查看該變量的值 。 
DophineSheduler上下游任務之間動態傳參案例及易錯點總結

文章插圖
? 但在實際使用中官網的例子是跑不通的,這里面有小坑,上述在使用 ${setValue(key=value)} 這種形式傳參的時候必須用引號引起來 。 如下才能成功echo '${setValue(key=value)}'
案例所示
DophineSheduler上下游任務之間動態傳參案例及易錯點總結

文章插圖
?上線執行后查看日志如下: 
DophineSheduler上下游任務之間動態傳參案例及易錯點總結

文章插圖
?可以看到結果已經打印出來 。如果取掉單引號會報如下錯誤:語法上就無法通過 。 
DophineSheduler上下游任務之間動態傳參案例及易錯點總結

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

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

文章插圖
? 任務2: 

推薦閱讀