工作流调度 Azkaban 带条件的工作流

官网文档

条件工作流功能允许用户自定义条件,决定是否运行某些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内容如下

JobA.sh内容如下

运行时参数需要重定向到文件$JOB_OUTPUT_PROP_FILE

  • JobB.sh内容如下

JobA.shJobB.shruntimeParam.flowflow20.project 打包成runtimeParam.zip

web ui创建项目、上传zip、执行flow

image-20210325171031676

运行此flow时,是周二,所以符合执行jobB的条件,所以发现jobA、jobB都执行成功

image-20210325171138861
image-20210323114056229
image-20210323115042974

如果不是周二或周日,那么jobB执行失败,如下

image-20210325171350641
image-20210323114850913
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内容如下

JobB.shmacro.flowflow20.project 打包成macro.zip

  • 注意JobB.sh跟上个例子相同的文件
  • 注意:生成zip文件时,故意没有将JobA.sh打包到zip文件;这样JobA肯定执行失败

web ui创建项目、上传zip、执行flow

image-20210323121331536
image-20210325171515976

发现JobA失败;JobB、JobC成功;查看Job List

image-20210325171636151
image-20210323121543644
image-20210323121614626
3. 运行时参数结合预定义宏

指定job是否执行的条件,除了单独由一个“运行时参数”或一个“预定义宏”指定外
还可以用两类的组合结果指定条件:

  • 即若干个“运行时参数”
  • 再加上一个“预定义宏”
  • 通过逻辑运算,根据最终结果是true还是false,决定job是否执行

举例:

  • JobA的输出参数param1的值等于1成立
  • 并且JobB的输出参数param2大于5成立
  • 两个条件都成立true && true
  • 整个条件结果是true,那么当前job才执行

举例:当前job的父 Job 至少一个成功才执行,当前job才被执行

举例:

  • 当前job的所有父 Job 全部完成,成立(true)
  • JobC的输出参数param3的值不等于foo,成立(true)
  • 两个条件都成立true && true
  • 整个条件结果是true,那么当前job才执行

举例:

  • 根据{JobD:param4}{JobE:parm5}all_success${JobF:parm6} == "bar"进行复杂的逻辑运算后
  • 如果最终结果是true
  • 那么,当前job才执行

flow文件mixtureCondition.flow,内容如下

write_to_props.sh内容如下

mixtureCondition.flowflow20.projectwrite_to_props.sh打包生成zip

web ui创建项目、上传zip、执行flow

image-20210325171846367
image-20210325172014251

Views: 6