在 Keeper 中,依赖分为前置依赖(紧前依赖)和后置依赖(紧前依赖)。前置依赖是调度任务运行的条件,前置条件必须满足时调度任务才会运行;后置依赖用于对计算结果的正确性进行检查,如果不正确则任务状态会变为“执行结果不正确”。依赖可以设置多个。
“无限循环任务”不支持设置前置依赖。其他类型的调度作业在手工“立即运行”时可以忽略前置依赖。
Keeper 支持三种类型的依赖,分别为任务依赖、SQL依赖和PQL依赖。
任务依赖 是指当前调度作业的任务的创建后需要等待依赖的调度作业的任务执行完成才能启动。比如在数据仓库中,ODS 层的任务完成后,DW 层的任务才能启动,即 DW 层的任务启动依赖于 ODS 层任务完成。
03:00
,但是依赖的任务时间为每天02:00
,那么依赖时间表达式就要设置成为yyyy-MM-dd 02:00:00
,其中的yyyy-MM-dd
部分在执行检查时会根据当前任务时间计算出来。也可以指定不是同一天的时间,如前一天的23:30
,表达式就要写成$task_time MINUS DAYS 1 FORMAT 'yyyy-MM-dd 23:30:00'
。这里是 PQL 中Sharp 表达式的语法,详见Sharp 表达式中关于时间的操作。调度作业的多个命令构成了调度作业的内部工作流,通过任务依赖,可以构建调度作业之间的工作流。在未来版本中,系统会提供作业工作流的管理功能。
注意,被依赖的调度作业不有轻易修改调度时间,否则会影响后续所有的依赖任务。另外,后置依赖不支持“任务依赖”设置。
SQL 依赖 是日常生产过程另一种常用的依赖形式,依赖需要指定一个 SELECT 查询语句,系统会检查这个 SELECT 语句是否有返回结果,如果有结果表示依赖成立,否则会下一分钟继续检查。SQL 依赖需要配置的项如下:
qross.properties
文件中设置好连接串。如果不设置,默认使用jdbc.default
连接。WHERE
条件一定得严谨。另外,SELECT 语句查询的 最后一行结果的值 可以传递给任务的命令,占位符格式为#{field}
。举例说明:查询语句为SELECT name, age FROM students WHERE id=1
,DAG 中的命令为java -jar score.jar name=#{name}&age=#{age}
,命令中的#{name}
和#{age}
在依赖成功后会被替换成 SELECT 语句查询的值。DAG 中任何类型的命令都支持这样传递值。UPDATE scores SET status='updating' WHERE name=&name AND age=#age
。SQL 依赖可用于后置依赖,即任务执行完成后的结果正确性检查,同样是如果查询有返回结果即判定任务的执行结果正确。
在 SQL 依赖的 SELECT 语句和非查询语句中,可以使用一些预设的变量。
$job_id
依赖所属的调度ID$task_id
当前任务ID$task_time
当前任务时间, 格式是 “yyyy-MM-dd HH:mm:00”$record_time
当前任务的创建时间,格式是 “yyyy-MM-dd HH:mm:ss”例如:SELECT id FROM extra_tasks WHERE task_id=$task_id
。主要用于扩展 Keeper。这些变量也可以通过参数的形式传递,如#{task_id}
。
PQL 依赖 可以理解为 SQL 依赖的高级版本,也可以理解为是自定义依赖。PQL 依赖除了可以访问数据库以外,还可以进行请求接口、读写文件等操作。使用 PQL 依赖,可以检查某个接口的返回值是否正确、REDIS 中的某个键是否有期望的值、文件是否存在等,详见 PQL 相关的文档。PQL 依赖的配置项如下:
qross.properties
文件中设置好连接串。如果不设置,默认使用jdbc.default
连接。也可以在 PQL 过程中通过 OPEN 语句打开指定的数据源。主 PQL 程序,必须项。需要输入 PQL 过程语句并且需要有返回值,如何返回值请参阅 PQL 中的 OUTPUT 语句。依赖是否成立由 PQL 的返回值确定,成立规则如下:
true
则成功,如true
、yes
、1
等true
0
null
SELECT 语句返回值为 TABLE,使用第一条集合规则。非查询语句返回影响的行数,使用数字规则。注意因为PQL的返回值不固定,所以并不能像 SQL 依赖一样向命令传递 PQL 的返回值。
在PQL依赖的主程序和额外程序中,可以使用一些预设的变量。
$job_id
依赖所属的调度 ID$task_id
当前任务 ID$task_time
当前任务时间, 格式是 “yyyy-MM-dd HH:mm:00”$record_time
当前任务的创建时间,格式是“yyyy-MM-dd HH:mm:ss”$retry_times
当前依赖的重试次数这些变量可以直接在 PQL 过程中使用。同样,这些变量也可以通过参数的形式传递,例如#{job_id}
。
因为 PQL 依赖不能像 SQL 依赖一样传递查询结果给工作流中的命令,但是非要实现也有解决方案,需要使用 Keeper 的系统表,但不建议这么做,对系统表的更改可能会产生意外的结果。
调度任务被创建后,有前置依赖的任务会 每分钟 检查一次依赖是否成立。对于“仅依赖触发”的调度作业,建议设置成为0
,表示一直检查。其他类型的调度作业默认设置为100
次,可根据实际应用场景增减。如果检查次数超过这个设置的最大值,调度任务状态会变为“检查超过限定次数”。
前置依赖和后置依赖分别相关两个异常事件。前置依赖如果检查次数超过最大限定次数,会触发“检查超过限定次数”事件;后置依赖如果检查结果不符合预期会触发“执行结果不正确”事件。可以在事件和预警页面进行相应的设置。
参考链接