-
快速上手-shell類型job參數傳遞
2. shell類型的job的參數傳遞
azkaban中的shell 作業,如何接收從webUI傳遞的參數?
step1: UI頁面輸入參數定義:
ui_test=test111111111
step2:在job文件myjob.job指定:
-
##作業定義文件UI輸入參數接收:
-
job_param4=${ui_test}
-
##作業定義文件腳本命令行引用UI輸入參數:
-
sh test_azkaban_job.sh "${job_param4}"
step3:shell test_azkaban_job.sh 的內容
vi test_azkaban_job.sh
echo "inputparamter:$1" #接收job文件中傳遞的參數。
問題:在頁面手動執行前面的job時,如果UI參數ui_test在job執行沒有輸入,會執行失敗。異常信息如下:
hello ERROR - Failed to build job executor for job helloCould not find variable substitution for variable(s) [param4->ui_test ]
在定時調度任務指定時,需要指定工作流參數flowParameters :ui_test,避免該錯誤。
運行時參數:在UI頁面重新輸入運行時參數時,可以覆蓋系統默認生成的參數值。
運行時參數,和UI輸入的參數,都可以認爲是全局參數,在整個工作流的作業
配置中,都可以通過 ${參數名} 的方式引用使用。
在shell 中直接引用 公共參數,運行時系統參數,UI輸入參數,是無效的。
在shell中只能直接使用環境變量;公共參數,運行時系統參數,UI輸入參數能只通過shell的腳本參數的方式傳遞
進來。
job文件中定義的環境變量參數,可以在shell腳本中直接引用,但只對當前job有效。
-
參數傳遞詳解
(1)azkaban的工作流中的參數可以分爲如下幾個類型:
1)、azkaban UI 頁面輸入參數, 2)、環境變量參數,
3)、job作業文件中定義的參數,4)、工作流的用戶定義的屬性文件,
4)、上游作業傳遞給下游的參數,5)、工作流運行時產生的系統參數,
6)、job的common參數等。
(2)參數的作業範圍分類,對當前job有效局部有效,對整個工作流全局有效。
參數類型 |
參數的作用域 |
UI 頁面輸入參數 |
flow全局有效 |
工作流ZIP壓縮包中的屬性文件 |
flow全局有效,zip文件目錄以及子目錄有效 |
工作流運行時參數 |
flow全局有效 |
環境變量參數 |
flow全局有效 |
job的common參數 |
job內局部有效 |
JOB文件中定義的參數 |
job內局部有效 |
上游作業傳遞給下游的參數 |
job內局部有效 |
全局參數,在整個工作流的作業文件配置中,都可以通過 ${參數名} 的方式引用使用。
(3) Job配置中的參數
- common參數配置
除了type,command,decpendencies三個參數外,還有如下一些保留參數可以爲每個job配置
參數 |
說明 |
retries |
失敗的job的自動重試的次數 |
retry.backoff |
重試的間隔(毫秒) |
working.dir |
覆蓋默認配置的執行job的目錄 |
env.property |
設置環境變量 |
failure.emails |
job失敗時發送的郵箱,用逗號隔開 |
success.emails |
job成功時發送的郵箱,用逗號隔開 |
notify.emails |
job成功或失敗都發送的郵箱,用逗號隔開 |
一個flow的email屬性,只會取最後一個job的配置,其他的job的email配置將會被忽略。
用戶也可以自用一下參數,用於接收外部或者上游job的參數,也可用於傳遞給shell腳本等。
- Runtime 屬性
這些屬性在job運行期間自動被添加.
參數 |
說明 |
azkaban.job.attempt |
job重試次數,從0開始增加 |
azkaban.job.id |
運行的job name |
azkaban.flow.flowid |
運行的job的flow name |
azkaban.flow.execid |
flow的執行id |
azkaban.flow.projectid |
工程id |
azkaban.flow.projectversion |
project上傳的版本 |
azkaban.flow.uuid |
flow uuid |
azkaban.flow.start.timestamp |
flow start的時間戳 |
azkaban.flow.start.year |
flow start的年份 |
azkaban.flow.start.month |
flow start 的月份 |
azkaban.flow.start.day |
flow start 的天 |
azkaban.flow.start.hour |
flow start的小時 |
azkaban.flow.start.minute |
start 分鐘 |
azkaban.flow.start.second |
start 秒 |
azkaban.flow.start.millseconds |
start的毫秒 |
azkaban.flow.start.timezone |
start 的時區 |
- 參數繼承
後綴爲.properties的文件將會作爲參數文件加載,並且爲flow中每個job所共享,屬性文件通過目錄分層結構繼承。
比如,在zip包中有以下結構
system.properties baz.job myflow/ myflow.properties myflow2.properties foo.job bar.job
system.properties是全局的屬性,將會被baz.job和myflow目錄下的foo.job和bar.job使用,但是baz.job不會繼承myflow.properties和myflow2.properties的屬性,因爲是它的下層.
- 參數替換
azkaban支持參數替換;替換參數樣式: azkaban會替換{}中的參數。無論${parameterName} 在job file中或者在參數文件中或者運行時參數發現,都可以被替換爲對應的值。
# shared.properties replaceparameter=bar
# myjob.job param1=mytest foo=${replaceparameter} #${replaceparameter}會替換爲bar param2=${param1} # ${param1} 會被替換成mytest。
前面這個例子,在myjob 作業運行前,foo 會被賦值爲bar , param2會被賦值爲mytest.
參數名不能有空格,標點符號等。
- Parameter Passing:參數傳遞
azkaban以job執行過程中,傳遞進來的臨時參數,運行時參數,項目中配置文件的參數,job定義中參數等 都保存在 ${JOB_PROP_FILE}文件中,保存格式爲key=value。執行job的中shell命令時,可以作爲參數傳遞。
JOB_PROP_FILE 是一個環境變量參數。
- Parameter Output:參數輸出
一個任務運行結束,可以將一些參數寫入到${JOB_OUTPUT_PROP_FILE}文件 中,azkaban會將這些參數傳遞到下游依賴的的job的參數文件${JOB_PROP_FILE}文件中,供下游job引用。
寫如到${JOB_OUTPUT_PROP_FILE}文件中參數需要是json格式的,否則會報json解析錯。
JOB_OUTPUT_PROP_FILE也是一個環境變量參數。
(4) shell類型的job的參數傳遞
azkaban中的shell 作業,如何接收從webUI傳遞的參數?
step1: UI頁面輸入參數定義:
ui_starttime=2018-07-01
step2:在job文件myjob.job指定:
##作業定義文件UI輸入參數接收: job_param4=${ui_starttime} ##作業定義文件腳本命令行引用UI輸入參數: sh test_azkaban_job.sh "${job_param4}"
step3:shell test_azkaban_job.sh 的內容
vi test_azkaban_job.sh
echo "inputparamter:$1" #接收job文件中傳遞的參數。
問題:
在頁面手動執行前面的job時,如果UI參數ui_test在job執行沒有輸入,會執行失敗。異常信息如下:
hello ERROR - Failed to build job executor for job helloCould not find variable substitution for variable(s) [param4->ui_starttime ]
在定時調度任務指定時,需要指定工作流參數flowParameters :ui_starttime,避免該錯誤。
其他:
運行時參數:在UI頁面重新輸入運行時參數時,可以覆蓋系統默認生成的參數值。
運行時參數,和UI輸入的參數,都可以認爲是全局參數,在整個工作流的作業
配置中,都可以通過 ${參數名} 的方式引用使用。
在shell 中直接引用 公共參數,運行時系統參數,UI輸入參數,是無效的。
在shell中只能直接使用環境變量;公共參數,運行時系統參數,UI輸入參數能只通過shell的腳本參數的方式傳遞進來。
job文件中定義的環境變量參數,可以在shell腳本中直接引用,但只對當前job有效。