工作流 DAG

工作流是任务调度的主要内容,是调度作业的核心,由一个或多个命令、程序或脚本构成,Keeper 把这些命令、程序或脚本统一称为 Command 。多个 Command 之间可以存在上下游关系,这种上下游关系构成 DAG,即“有向无环图”。下游 Command 可以依赖一个或多个上游 Command ,多个下游 Command 可以依赖同一个上游 Command。

命令 Command

在当前的 Keeper 系统中,单个 Command 可以是 Shell 命令、PQL 过程或 Python 脚本。

Shell 命令

Shell 命令基本上已经可以满足几乎所有的配置要求,因为所有的程序都可以转成一行 Shell 命令的形式,PQL 过程和 Python 脚本都可以配置成 Shell 命令。这里还 支持多行 Shell 命令,在运行时会自动保存为sh文件并添加可执行权限,注意这个功能仅在 Linux 系统中支持且启动 Keeper 程序的用户有相应的权限。

很多时候,我们需要为 Command 传递一些变化的参数,特别是日期时间。举个例子,如程序运行时间是凌晨 1 点,但希望计算前一天的数据,虽然可以在计算程序中写死,根据当前日期得到前一天的日期,但是这样的话这个程序就具体时效限制,即必须在当天执行成功才可以,如果追溯数据或失败重跑则只能计算前一天的数据。这种情况下,通常会把要计算的日期通过参数传递给 Command。通过 PQL 的嵌入式功能,我们可以很方便的向 Command 传递参数。

上例中,Keeper 在运行这个命令时会自动计算<%= $task_time MINUS DAYS 1 FORMAT 'yyyyMMdd' %>的值然后将结果作为 Shell 命令的一部分执行。这里的<%`和`%>中间的逻辑由嵌入式 PQL 提供解析支持,PQL 的所有内容都可以在这里使用。这里最常用的是变量函数Sharp 表达式,可以使用所有的全局变量和以下已赋值的变量:

另外,所有类型的 Command 都支持与 OneApiVoyager 相同的传参形式#{name}。如

可用的参数同上面列出的预定义变量,但注意这些参数都没有类型,时间和字符串类型不会自动加引号。

PQL 过程

PQL 过程也可以在 Command 中直接使用,在执行时 Keeper 会调用 Worker 执行器来执行这个 PQL 过程。PQL 过程也可以保存为文件,通过 Shell 命令执行,如PQL --file /usr/qross/pql/test.sql。 PQL 命令可用的参数详见 Worker 执行器。同样,PQL 过程也支持#{name}格式的参数,可用参数见前面的说明。

Python 脚本

Python 脚本同样可以在 Command 中直接使用,在执行时会自动保存为py文件并执行这个文件,默认为Python3的执行器,注意运行机器上必须安装Python3

Python 脚本中同样通过和 Shell 同样的方式嵌入 PQL 逻辑,也支持相同的变量或参数。

命令的属性

除了命令的类型和内容外,还包含其他几个属性。

命令的名称

虽然命令的名称可以由任何字符构成,但是仍建议在设定的名称清晰易读,调度首页的搜索同时会搜索这个名称。

命令参数

上面在介绍 Shell 命令时同时介绍了一些可以传递的参数,这些参数除了可以用#{name}占位符的形式进行设置以外,还会自动转成用户变量,在 PQL 逻辑中使用。除了自动传递的参数以外,Keeper 支持手动设置参数,我们可以在命令或脚本中定义一些参数,然后再运行时设置不同的参数,以实现不同的业务逻辑。自定义传参适用于两种场景:

  1. 在调度自动运行时参数是固定的,但当手工运行任务时,可以即时修改这些参数,以产生不同的结果。
  2. 使用命令模板来设置工作流中的某个命令,只传递参数即可完成不同的命令设置。

在不使用命令模板时,可以使用查询字符串(如a=1&b=2&c=3)或 Json 格式进行传参。在使用命令模板时,参数只能是 Json 格式,但操作界面会表现为多个输入框的形式。参数在 PQL 过程中的接收和处理逻辑请参数向 PQL 传递参数

超时时间

设定一个时间,当命令的执行时间大于这个设置时间时,Keeper 会杀掉这个命令并重新运行,在达到最大次数时会触发 任务执行超时 事件,可以在事件中指定相应的处理方式。这个属性的单位的秒,默认值为0,表示不限制时间。这个属性建议慎重使用,因为程序多次运行并不能保证结果的一致性,除非你的计算程序中做了处理。

最大重试次数

在命令运行超时或失败时,自动重新运行这个命令,这个次数表示最大的重试次数。一般设定为03次。由于外部环境而不是程序本身引起的错误,比如数据库短时间连接失败等,可设置这个参数来避免。

上下游关系

这个设置非常重要!在命令列表页可以指定命令的上游 Command 的 ID 来设置命令的上下游关系,格式必须为(id),如(2)表示当ID为2的命令执行成功后才执行当前的命令,(23)(24)表示当 ID 为2324的命令执行完成后才执行当前的命令。在未来的版本中,系统将提供图形化的方式配置 DAG。


参考链接


微信公众号
码农老吴  |  星源工作室  |  开发月志  |  问题反馈
联系我们:wu@qross.io     手机/微信:18618171102
京 ICP 备 20027445 号
$(h1)!