条件工作流功能允许用户自定义条件,决定是否运行某些Job
分两种情况
- 运行时参数:可以根据一个job之前的 job的输出,决定此job是执行还是不执行
- 预定义宏:也可以使用基于之前的job的status预定义宏,决定此job是执行还是不执行
在这些条件下,用户可以在确定 Job执行逻辑时获得更大的灵活性
例如,只要父 Job 之一成功,就可以运行当前 Job
1、运行时参数
原理
- 父 Job 将参数写入
JOB_OUTPUT_PROP_FILE
环境变量所指向的文件 - 子 Job 使用
${jobName:param}
来获取父 Job 输出的参数,参数值与一个字符串或数字进行比较,来定义执行条件
支持的比较、逻辑运算符有
==
等于!=
不等于>
大于>=
大于等于<
小于<=
小于等于&&
与||
或!
非
先定义一个flow文件,包含两个job
- jobA执行一个sh脚本,脚本将当前是星期几的值,写入文件
$JOB_OUTPUT_PROP_FILE
- jobB执行一个脚本,判断如果jobA输出的是星期二或星期四,则jobB执行
flow文件runtimeParam.flow
内容如下
1 2 3 4 5 6 7 8 9 10 11 12 |
nodes: - name: JobA type: command config: command: sh JobA.sh - name: JobB type: command dependsOn: - JobA config: command: sh JobB.sh condition: ${JobA:dayOfTheWeek} == 2 || ${JobA:dayOfTheWeek} == 4 |
JobA.sh
内容如下
1 2 3 4 |
#!/bin/bash echo "do JobA" dayOfTheWeek=`date +%w` echo "{\"dayOfTheWeek\":$dayOfTheWeek}" > $JOB_OUTPUT_PROP_FILE |
运行时参数需要重定向到文件
$JOB_OUTPUT_PROP_FILE
中
JobB.sh
内容如下
1 2 |
#!/bin/bash echo "do JobB" |
将 JobA.sh
、JobB.sh
、 runtimeParam.flow
和 flow20.project
打包成runtimeParam.zip
web ui创建项目、上传zip、执行flow
运行此flow时,是周二,所以符合执行jobB的条件,所以发现jobA、jobB都执行成功
如果不是周二或周日,那么jobB执行失败,如下
2、预定义宏
Azkaban 中预置了几个预定义宏。
预定义宏会根据当前job的所有父 Job 的完成情况进行判断,再决定是否执行当前job。
可用的预定义宏如下:
- 1、
all_success
: 表示父 Job 全部成功才执行(默认) - 2、
all_done
:表示父 Job 全部完成才执行 - 3、
all_failed
:表示父 Job 全部失败才执行 - 4、
one_success
:表示父 Job 至少一个成功才执行 - 5、
one_failed
:表示父 Job 至少一个失败才执行
每个宏对应的job 状态如下
- all_done:
FAILED, KILLED, SUCCEEDED, SKIPPED, FAILED_SUCCEEDED, CANCELLED
- all_success / one_success:
SUCCEEDED, SKIPPED, FAILED_SUCCEEDED
- all_failed / one_failed:
FAILED, KILLED, CANCELLED
案例:flow中有3个job
- jobA执行一个sh脚本
- jobB执行一个sh脚本
- jobC执行一个sh命令,只要jobA或jobB任一个成功,jobC才执行
flow文件macro.flow
内容如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
nodes: - name: JobA type: command config: command: sh JobA.sh - name: JobB type: command config: command: sh JobB.sh - name: JobC type: command dependsOn: - JobA - JobB config: command: echo 'This is jobC' condition: one_success |
将JobB.sh
、 macro.flow
、flow20.project
打包成macro.zip
- 注意
JobB.sh
跟上个例子相同的文件 - 注意:生成zip文件时,故意没有将JobA.sh打包到zip文件;这样JobA肯定执行失败
web ui创建项目、上传zip、执行flow
发现JobA失败;JobB、JobC成功;查看Job List
3. 运行时参数结合预定义宏
指定job是否执行的条件,除了单独由一个“运行时参数”或一个“预定义宏”指定外
还可以用两类的组合结果指定条件:
- 即若干个“运行时参数”
- 再加上一个“预定义宏”
- 通过逻辑运算,根据最终结果是true还是false,决定job是否执行
举例:
- JobA的输出参数param1的值等于1成立
- 并且JobB的输出参数param2大于5成立
- 两个条件都成立true && true
- 整个条件结果是true,那么当前job才执行
1 |
condition: ${JobA:param1} == 1 && ${JobB:param2} > 5 |
举例:当前job的父 Job 至少一个成功才执行,当前job才被执行
1 |
condition: one_success |
举例:
- 当前job的所有父 Job 全部完成,成立(true)
- JobC的输出参数param3的值不等于foo,成立(true)
- 两个条件都成立true && true
- 整个条件结果是true,那么当前job才执行
1 |
condition: all_done && ${JobC:param3} != "foo" |
举例:
- 根据
{JobD:param4}
、{JobE:parm5}
、all_success
、${JobF:parm6} == "bar"
进行复杂的逻辑运算后 - 如果最终结果是true
- 那么,当前job才执行
1 |
condition: (!{JobD:param4} || !{JobE:parm5}) && all_success || ${JobF:parm6} == "bar" |
flow文件mixtureCondition.flow
,内容如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
nodes: - name: JobA type: command config: command: sh write_to_props.sh - name: JobB type: command dependsOn: - JobA config: command: echo “This is JobB.” condition: ${JobA:jobAParam1} == 1 - name: JobC type: command dependsOn: - JobA config: command: echo “This is JobC.” condition: ${JobA:jobAParam1} == 2 - name: JobD type: command dependsOn: - JobB - JobC config: command: pwd condition: one_success |
write_to_props.sh
内容如下
1 2 |
#!/bin/bash echo '{"jobAParam1":"1"}' > $JOB_OUTPUT_PROP_FILE |
将mixtureCondition.flow
、flow20.project
、write_to_props.sh
打包生成zip
web ui创建项目、上传zip、执行flow
Views: 6