官方文档地址:https://dolphinscheduler.apache.org/zh-cn/docs/3.1.8
因为官方文档经常出现文档桑、图片加载缓慢、中文名对应关系较差,且存在部分链接异常的情况,所以我将其重新整理、排版以方便阅读。
同时做了部分优化,增加了一些注解,补充了中英文对应关系。
3.4 参数
3.4.1 内置参数
3.4.1.1 基础内置参数
变量名 | 声明方式 | 含义 |
---|---|---|
system.biz.date | ${system.biz.date} | 日常调度实例定时的定时时间前一天,格式为 yyyyMMdd |
system.biz.curdate | ${system.biz.curdate} | 日常调度实例定时的定时时间,格式为 yyyyMMdd |
system.datetime | ${system.datetime} | 日常调度实例定时的定时时间,格式为 yyyyMMddHHmmss |
3.4.1.2 衍生内置参数
-
支持代码中自定义变量名,声明方式:
${变量名}
。可以是引用 “系统参数” -
我们定义这种基准变量为
$[...]
格式的,$[yyyyMMddHHmmss]
是可以任意分解组合的,比如:$[yyyyMMdd]
,$[HHmmss]
,$[yyyy-MM-dd]
等 -
也可以通过以下两种方式:
1.使用add_months()函数,该函数用于加减月份, 第一个入口参数为[yyyyMMdd],表示返回时间的格式 第二个入口参数为月份偏移量,表示加减多少个月
- 后 N 年:
$[add_months(yyyyMMdd,12*N)]
- 前 N 年:
$[add_months(yyyyMMdd,-12*N)]
- 后 N 月:
$[add_months(yyyyMMdd,N)]
- 前 N 月:
$[add_months(yyyyMMdd,-N)]
2.直接加减数字 在自定义格式后直接“+/-”数字
- 后 N 周:
$[yyyyMMdd+7*N]
- 前 N 周:
$[yyyyMMdd-7*N]
- 后 N 天:
$[yyyyMMdd+N]
- 前 N 天:
$[yyyyMMdd-N]
- 后 N 小时:
$[HHmmss+N/24]
- 前 N 小时:
$[HHmmss-N/24]
- 后 N 分钟:
$[HHmmss+N/24/60]
- 前 N 分钟:
$[HHmmss-N/24/60]
- 后 N 年:
3.4.2 全局参数
3.4.2.1 作用域
全局参数是指针对 整个工作流 的所有任务节点都有效的参数,在工作流定义页面配置。
3.4.2.2 使用方式
具体的使用方式可结合实际的生产情况而定,这里演示为使用 Shell 任务打印出前一天的日期。
3.4.2.2.1 创建 Shell 任务
创建一个 Shell 任务,并在脚本内容中输入 echo ${dt}
。此时 dt 则为我们需要声明的全局参数。如下图所示:
3.4.2.2.2 保存工作流,并设置全局参数
全局参数配置方式如下:在工作流定义页面,点击“设置全局”右边的加号,填写对应的变量名称和对应的值,保存即可。如下图所示:
注:这里定义的 dt 参数可以被其它任一节点的局部参数引用。
3.4.2.2.3 任务实例查看执行结果
进入任务实例页面,可以通过查看日志,验证任务的执行结果,判断参数是否有效。
3.4.3 本地参数
3.4.3.1 作用域
在任务定义页面配置的参数,默认作用域仅限该任务,如果配置了 3.3.4 - 参数传递 则可将该参数作用到下游任务中。
3.4.3.2 使用方式
本地参数配置方式如下:在任务定义页面,点击 “自定义参数” 右边的加号,填写对应的变量名称和对应的值,保存即可。
- 如果要在单个任务中使用参数,请参阅通过自定义参数使用
- 如果要在任务中使用配置参数并在下游任务中使用它们:
- 如果你只是想要简单使用,且不使用自定义参数, 请参阅 通过
setValue
和自定义参数 export 本地参数 - 如果想要使用自定义参数, 请参阅 通过
setValue
和自定义参数 export 本地参数 - 如果想要使用 Bash 参数, 请参阅 通过
setValue
和 Bash 环境变量参数 export 本地参数
- 如果你只是想要简单使用,且不使用自定义参数, 请参阅 通过
3.4.3.3 任务样例
3.4.3.3.1 通过自定义参数使用
本样例展示了如何使用本地参数,打印输出当前日期。创建一个 Shell 任务,并编写脚本内容为 echo ${dt}
。点击配置栏中的自定义参数,配置如下图所示:
参数说明:
- dt:参数名
- IN:IN 表示局部参数仅能在当前节点使用,OUT 表示局部参数可以向下游传递
- DATE:数据类型,日期
$[yyyy-MM-dd]
:自定义格式的衍生内置参数
保存工作流并运行,查看 Shell 任务输出日志。
注:本地参数可以在当前任务节点的工作流中,设置其为 OUT 则可以传递给下游的工作流使用,可以参考:3.3.4 - 参数传递
3.4.3.3.2 通过 setValue
export 本地参数
如果你想简单 export 参数然后在下游任务中使用它们,你可以在你的任务中使用 setValue
,你可以将参数统一在一个任务中管理。在 Shell 任务中使用语法 echo '${setValue(set_val=123)}'
(不要忘记单引号) 并添加新的 OUT
自定义参数来 export 它。
你可以在下游任务中使用语法 echo '${set_val}'
在获取设定的值。
3.4.3.3.3 通过 setValue
和自定义参数 export 本地参数
如果你想用自定义参数而不是常量值来实现参数 export,并下游任务中使用它们,你可以在通过 setValue
和 自定义参数实现,当你想改变参数的值时可以直接改变 “自定义参数”模块中的值,这让程序更加容易维护。您可以在 Shell 任务中使用语法 echo "#{setValue(set_val_param=${val})}"
(如果你想要将任何 变量赋值给 setValue
请不要忘记使用双引号)并添加新的 IN
自定义参数用于输入变量 val
和 OUT
自定义参数用于 export 参数 set_val_param
。
你可以在下游任务中使用语法 echo '${set_val_param}'
在获取设定的值。
3.4.3.3.4 通过 setValue
和 Bash 环境变量参数 export 本地参数
如果你想用 bash 变量而不是常量值 export 参数,并在下游任务中使用它们,你可以在通过 setValue
和 Bash 变量实现,它更灵活,例如你动态获取现有的本地 或 HTTP 资源获取设定变量。 您可以使用类似的语法
lines_num=$(wget https://raw.githubusercontent.com/apache/dolphinscheduler/dev/README.md -q -O - | wc -l | xargs)
echo "#{setValue(set_val_var=${lines_num})}"
在 Shell 任务中(如果你想要将任何变量赋值给 setValue
请不要忘记使用双引号)和 OUT
自定义参数用于 export 参数 set_val_var
。
你可以在下游任务中使用语法 echo '${set_val_var}'
在获取设定的值。
3.4.4 参数传递(参数的引用)
DolphinScheduler 提供参数间相互引用的能力,包括:本地参数引用全局参数、上下游参数传递。因为有引用的存在,就涉及当参数名相同时,参数的优先级问题,详见 3.4.5 参数优先级
3.4.4.1 本地任务引用全局参数
本地任务引用全局参数的前提是,你已经定义了 3.4.2 全局参数,使用方式和 3.4.3 本地参数 中的使用方式类似,但是参数的值需要配置成全局参数中的 key。
3.4.4.2 上游任务传递给下游任务
DolphinScheduler 允许在任务间进行参数传递,目前传递方向仅支持上游单向传递给下游。目前支持这个特性的任务类型有:
当定义上游节点时,如果有需要将该节点的结果传递给有依赖关系的下游节点,需要在【当前节点设置】的【自定义参数】设置一个方向是 OUT 的变量。目前我们主要针对 SQL 和 SHELL 节点做了可以向下传递参数的功能。
上游传递的参数可以在下游节点中被更新,更新方法与设置参数相同。
如果定义了同名的传递参数,上游节点的参数将被覆盖。
注:若节点之间没有依赖关系,则局部参数无法通过上游传递。
3.4.4.3.1 任务样例
本样例展示了如何使用参数传递的功能,通过 SHELL 任务来创建本地参数并赋值传递给下游,SQL 任务通过获得上游任务的参数完成查询操作。
创建 SHELL 任务并设置参数:
用户需要传递参数,在定义 SHELL 脚本时,需要输出格式为 ${setValue(key=value)}
的语句,key 为对应参数的 prop,value 为该参数的值。
创建 Node_A 任务,在自定义参数中添加 output 和 value 参数,并编写如下脚本:
参数说明:
- value:方向选择为 IN,并赋值为 66
- output:方向选择为 OUT,通过脚本
'${setValue(output=1)}'
赋值,并传递给下游参数
SHELL 节点定义时当日志检测到 ${setValue(output=1)} 的格式时,会将 1 赋值给 output,下游节点便可以直接使用变量 output 的值。同样,您可以在【工作流实例】页面,找到对应的节点实例,便可以查看该变量的值。
创建 Node_B 任务,主要用于测试输出上游任务 Node_A 传递的参数。
创建 SQL 任务并使用参数:
完成上述的 SHELL 任务之后,我们可以使用上游所传递的 output 作为 SQL 的查询对象。其中将所查询的 id 重命名为 ID,作为参数输出。
注:如果 SQL 节点的结果只有一行,一个或多个字段,参数的名字需要和字段名称一致。数据类型可选择为除 LIST 以外的其他类型。变量会选择 SQL 查询结果中的列名中与该变量名称相同的列对应的值。
如果 SQL 节点的结果为多行,一个或多个字段,参数的名字需要和字段名称一致。数据类型选择为 LIST。获取到 SQL 查询结果后会将对应列转化为 LIST,并将该结果转化为 JSON 后作为对应变量的值。
保存工作流并设置全局参数:点击保存工作流图标,并设置全局参数 output 和 value。
查看运行结果:创建完成工作流之后,上线运行该工作流,查看其运行结果。
Node_A 运行结果如下:
Node_B 运行结果如下:
Node_mysql 运行结果如下:
虽然在 Node_A 的脚本中为 output 赋值为 1,但日志中显示的值仍然为 100。但根据参数优先级的原则:本地参数 > 上游任务传递的参数 > 全局参数
,在 Node_B 中输出的值为 1。则证明 output 参数参照预期的值在该工作流中传递,并在 Node_mysql 中使用该值完成查询操作。
但是 value 的值却只有在 Node_A 中输出为 66,其原因为 value 的方向选择为 IN,只有当方向为 OUT 时才会被定义为变量输出。
Python 任务传递参数:
使用 print('${setValue(key=%s)}' % value)
,DolphinScheduler会捕捉输出中的 ${setValue(key=value}
来进行参数捕捉,从而传递到下游
如
3.4.5 参数优先级
DolphinScheduler 中所涉及的参数值的定义可能来自三种类型:
因为参数的值存在多个来源,当参数名相同时,就需要会存在参数优先级的问题。DolphinScheduler 参数的优先级从高到低为:本地参数 > 上游任务传递的参数 > 全局参数
在上游任务传递的参数中,由于上游可能存在多个任务向下游传递参数,当上游传递的参数名称相同时:
- 下游节点会优先使用值为非空的参数
- 如果存在多个值为非空的参数,则按照上游任务的完成时间排序,选择完成时间最早的上游任务对应的参数
3.4.5.1 例子
下面例子向你展示如何使用任务参数传递的优先级问题
1:先以 shell 节点解释第一种情况
节点 【useParam】可以使用到节点【createParam】中设置的变量。而节点 【useParam】与节点【noUseParam】中并没有依赖关系,所以并不会获取到节点【noUseParam】的变量。上图中只是以 shell 节点作为例子,其他类型节点具有相同的使用规则。
其中节点【createParam】在使用变量时直接使用即可。另外该节点设置了 “key” 和 “key1” 两个变量,这里用户用定义了一个与上游节点传递的变量名相同的变量 key1,并且赋值为 “12”,但是由于我们设置的优先级的关系,这里的值 “12” 会被使用,最终上游节点设置的变量值会被抛弃。
2:我们再以 sql 节点来解释另外一种情况
节点【use_create】的定义如下:
“status” 是当前节点设置的节点的自有变量。但是用户在保存工作流时也同样设置了 “status” 变量(全局参数),并且赋值为 -1。那在该 SQL 执行时,status 的值为优先级更高的 2。抛弃了全局变量中的值。
这里的 “id” 是上游节点设置的变量,用户在节点【createParam1】、节点【createParam2】中设置了相同参数名 “id” 的参数。而节点【use_create】中使用了最先结束的【createParam1】的值。
3.5 数据源中心
3.5.1 MySQL 数据源
- 数据源:选择 MYSQL
- 数据源名称:输入数据源的名称
- 描述:输入数据源的描述
- IP 主机名:输入连接 MySQL 的 IP
- 端口:输入连接 MySQL 的端口
- 用户名:设置连接 MySQL 的用户名
- 密码:设置连接 MySQL 的密码
- 数据库名:输入连接 MySQL 的数据库名称
- Jdbc 连接参数:用于 MySQL 连接的参数设置,以 JSON 形式填写
3.5.1.1 是否原生支持
否,使用前需请参考 数据源配置 中的 “数据源中心” 章节激活数据源。
3.5.2 PostgreSQL 数据源
- 数据源:选择 POSTGRESQL
- 数据源名称:输入数据源的名称
- 描述:输入数据源的描述
- IP 主机名:输入连接 POSTGRESQL 的 IP
- 端口:输入连接 POSTGRESQL 的端口
- 用户名:设置连接 POSTGRESQL 的用户名
- 密码:设置连接 POSTGRESQL 的密码
- 数据库名:输入连接 POSTGRESQL 的数据库名称
- Jdbc 连接参数:用于 POSTGRESQL 连接的参数设置,以 JSON 形式填写
3.5.2.1 是否原生支持
是,数据源不需要任务附加操作即可使用。
3.5.3 HIVE 数据源
3.5.3.1 使用HiveServer2
- 数据源:选择 HIVE
- 数据源名称:输入数据源的名称
- 描述:输入数据源的描述
- IP 主机名:输入连接 HIVE 的 IP
- 端口:输入连接 HIVE 的端口
- 用户名:设置连接 HIVE 的用户名
- 密码:设置连接 HIVE 的密码
- 数据库名:输入连接 HIVE 的数据库名称
- Jdbc 连接参数:用于 HIVE 连接的参数设置,以 JSON 形式填写
注意:如果您希望在同一个会话中执行多个 HIVE SQL,您可以修改配置文件 common.properties
中的配置,设置 support.hive.oneSession = true
。 这对运行 HIVE SQL 前设置环境变量的场景会很有帮助。参数 support.hive.oneSession
默认值为 false
,多条 SQL 将在不同的会话中运行。
3.5.3.2 使用 HiveServer2 HA Zookeeper
注意:如果没有开启 kerberos,请保证参数 hadoop.security.authentication.startup.state
值为 false
, 参数 java.security.krb5.conf.path
值为空. 开启了 kerberos,则需要在 common.properties
配置以下参数
# whether to startup kerberos
hadoop.security.authentication.startup.state=true
# java.security.krb5.conf path
java.security.krb5.conf.path=/opt/krb5.conf
# login user from keytab username
login.user.keytab.username=hdfs-mycluster@ESZ.COM
# login user from keytab path
login.user.keytab.path=/opt/hdfs.headless.keytab
3.5.3.3 是否原生支持
是,数据源不需要任务附加操作即可使用。
3.5.4 Spark
- 数据源:选择 Spark
- 数据源名称:输入数据源的名称
- 描述:输入数据源的描述
- IP/主机名:输入连接Spark的IP
- 端口:输入连接Spark的端口
- 用户名:设置连接Spark的用户名
- 密码:设置连接Spark的密码
- 数据库名:输入连接Spark的数据库名称
- Jdbc连接参数:用于Spark连接的参数设置,以JSON形式填写
注意:如果开启了kerberos,则需要填写 Principal
3.5.4.1 是否原生支持
是,数据源不需要任务附加操作即可使用。
3.5.5 Amazon Athena 数据源
- 数据源:选择 ATHENA
- 数据源名称:输入数据源的名称
- 描述:输入数据源的描述
- 用户名:设置连接 AWS 的 access key
- 密码:设置连接 AWS 的 secret access key
- AwsRegion: 设置连接 AWS 的区域
- 数据库名:输入连接 ATHENA 的数据库名称
- Jdbc 连接参数:用于 ATHENA 连接的参数设置,以 JSON 形式填写
3.5.5.1 是否原生支持
- 否,使用前需请参考 数据源配置 中的 “数据源中心” 章节激活数据源。
- JDBC驱动配置参考文档 athena-connect-with-jdbc
- 驱动下载链接 SimbaAthenaJDBC-2.0.31.1000/AthenaJDBC42.jar