参数传递时调度系统工作流运行时非常重要的一部分,工作流的执行,单个作业的执行,多个工作流之间的依赖执行,历史任务重算,都涉及参数传递和同步.
(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配置中的参数
除了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脚本等。
这些属性在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.
参数名不能有空格,标点符号等。
azkaban以job执行过程中,传递进来的临时参数,运行时参数,项目中配置文件的参数,job定义中参数等 都保存在 ${JOB_PROP_FILE}文件中,保存格式为key=value。执行job的中shell命令时,可以作为参数传递。
JOB_PROP_FILE 是一个环境变量参数。
一个任务运行结束,可以将一些参数写入到${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有效。
参考:http://www.mamicode.com/info-detail-2106795.html
https://www.cnblogs.com/honeybee/p/7921626.html