Apache Linkis自定義變數實踐分享

微眾開源 發表於 2022-06-29
  1. 總述
    需求背景
    使用者希望在寫程式碼時,能夠定義一些公共變數然後執行的時候進行替換,比如使用者每天都會批量跑同一段sql,需要指定上一天的分割槽時間,如果基於sql去寫會比較複雜如果系統提供一個run_date的變數將會非常方便使用。

目標
支援任務程式碼的變數替換
支援自定義變數,支援使用者在指令碼和提交給Linkis的任務引數定義自定義變數,支援簡單的+,-等計算
預設定系統變數:run_date,run_month,run_today等系統變數

  1. 總體設計
    在Linkis任務執行過程中自定義變數在Entrance進行,主要通過Entrance在任務提交執行前的攔截器進行攔截替換實現,通過正規表示式獲取到任務程式碼中使用到的變數和定義的變數,並通過任務傳入的自定義變數初始值完成程式碼的替換,變成最終可以執行的程式碼。

2.1 技術架構
自定義變數整體架構如下,用於任務提交過來後,會經過變數替換攔截器。首先會解析出所有程式碼中用到的變數和表示式,然後通過和系統以及使用者自定義的變數初始值進行替換,最終將解析後的程式碼提交給EngineConn執行。所以到底層引擎已經是替換好的程式碼。
圖片

  1. 功能介紹
    Linkis支援的變數型別分為自定義變數和系統內建變數,內部變數是Linkis預先定義好的,可以直接進行使用。然後不同的變數型別支援不同的計算格式:String支援+、整數小數支援+-*/,日期支援+-。

3.1 內建變數
目前已支援的內建變數如下:
圖片

具體細節:
1、run_date為核心自帶日期變數,支援使用者自定義日期,如果不指定預設為當前系統時間的前一天。
2、其他衍生內建日期變數定義:其他日期內建變數都是相對run_date計算出來的,一旦run_date變化,其他變數值也會自動跟著變化,其他日期變數不支援設定初始值,只能通過修改run_date進行修改。
3、內建變數支援更加豐富的使用場景:${run_date-1}為run_data的前一天;${run_month_begin-1}為run_month_begin的上個月的第一天,這裡的-1表示減一個月。

3.2 自定義變數
什麼是自定義變數?先定義,後使用的使用者變數。使用者自定義變數暫時支援字串,整數,浮點數變數的定義,其中字串支援+法,整數和浮點數支援+-*/方法。使用者自定義變數與SparkSQL和HQL本身支援的set變數語法不衝突,但是不允許同名。如何定義和使用自定義變數?如下:

程式碼中定義,在任務程式碼前進行指定

sql型別定義方式:

[email protected] f=20.1

python/Shell型別定義如下:

@set f=20.1

注意:只支援一行定義一個變數

使用都是直接在程式碼中使用通過 {varName表示式},如${f*2}

3.3 變數作用域
在linkis中自定義變數也有作用域,優先順序為指令碼中定義的變數大於在任務引數中定義的Variable,大於內建的run_date變數。任務引數中定義如下:

restful

{

"executionContent":{"code":"select \"${f-1}\";","runType":"sql"},

"params":{

"variable":{f:"20.1"},

"configuration":{

"runtime":{

"linkis.openlookeng.url":"http://127.0.0.1:9090"

}

}

},

"source":{"scriptPath":"file:///mnt/bdp/hadoop/1.sql"},

"labels":{

"engineType":"spark-2.4.3",

"userCreator":"hadoop-IDE"

}

}

java SDK

JobSubmitAction.builder

.addExecuteCode(code)

.setStartupParams(startupMap)

.setUser(user)//submit user

.addExecuteUser(user)//execute user

.setLabels(labels)

.setVariableMap(varMap)//setVar

.build

  1. 最後
    社群當前正在舉辦徵文大賽,最高獎勵可得 “1000元京東卡+500元社群禮品”哦,戳https://mp.weixin.qq.com/s/Kn... 瞭解