全部产品
大数据开发套件

参数配置

更新时间:2017-09-04 20:07:20   分享:   

为使任务自动周期运行时能动态适配环境变化,大数据开发套件提供了参数配置的功能,如下表所示:

参数类型 设置方式 适用类型 参数编辑框示例
系统参数 bdp.system.bizdate 和bdp.system.cyctime 在调度系统中运行时,无须在编辑框设置,可直接在代码中引用 ${bdp.system.bizdate}和${bdp.system.cyctime}, 系统将自动替换这两个参数的取值 全部节点类型
自定义参数 在代码中引用${key1},${key2}, 然后在“参数”编辑框以如下方式设置 “key1=value1 key2=value2”, 除Shell外的其他节点类型 常量参数:param1=”abc” param2=1234; 变量参数:param1=$[yyyymmdd], 结果将基于bdp.system.cyctime的取值计算
在代码中引用$1 $2 $3, 然后在“参数”编辑框以如下方式设置: “value1 value2 value3” Shell类型 常量参数:”abc” 1234; 变量参数:$[yyyymmdd], 结果将基于bdp.system.cyctime的取值计算

系统参数

大数据开发套件提供了 2 个系统参数,定义如下:

  • ${bdp.system.cyctime}:定义为一个实例的定时运行时间,默认格式为:yyyymmddhh24miss。
  • ${bdp.system.bizdate}:定义为一个实例计算时对应的业务日期,业务日期默认为运行日期的前一天,默认以 yyyymmdd 的格式显示。

从定义可知,运行时间和业务日期有如下计算公式:运行时间=(业务日期+1)+定时时间

若使用系统参数,无需在编辑框设置,直接在代码中引用 ${bdp.system.bizdate} 和 ${bdp.system.cyctime} 即可,系统将自动替换代码中对这两个参数的引用字段。

注意:

一个周期任务的 调度属性,配置的是 运行时间 的定时规律,因此可以根据实例的定时运行时间反推业务日期,从而得知每个实例中这两个参数的取值。

入门示例

设置一个 ODPS_SQL 任务为小时调度,每天 00:00-23:59 时间段里每隔 1 小时执行一次,若想在代码中使用系统参数,则可按如下步骤进行操作:

  1. 在代码中直接引用系统参数。节点代码如下:

    1. insert overwrite table tb1 partition(ds ='20150304') select
    2. c1,c2,c3
    3. from (
    4. select * from tb2
    5. where ds ='${bdp.system.cyctime}') t
    6. full outer join(
    7. select * from tb3
    8. where ds = '${bdp.system.bizdate}') y
    9. on t.c1 = y.c1;
  2. 设置时间周期为每隔 1 小时运行一次。

  3. 设置系统参数的编辑框为空。

  4. 查看系统运行的实例日志。

    有 4 种方式可以触发运行,其中 3 种可以生成实例,详情请参见 数据开发概述。生成实例的运行模式可以比较好的观察到系统对参数的计算。

    以系统周期自动运行为例,代码提交后第二天在运维中心可以看到系统自动按时间周期生成的运行实例。

    例如:在 2017 年 07 月 16 日这一天,调度系统为该任务生成了 24 个运行实例。业务日期应当全部为 2017 年 07 月 15 日(运行日期-1天),因此 ${bdp.system.bizdate} 全部显示为 20170715。运行时间则为 (运行日期+定时时间),因此 ${bdp.system.cyctime} 显示为 20170716000000+每个实例自己的定时时间。

    每个实例的运行日志打开后搜索代码中的替换情况如下:

    • 第一个实例定时时间为 2017-07-16 00:00:00,则 bdp.system.bizdate 替换的结果为 20170715; bdp.system.cyctime 替换的结果为 20170716000000。

    • 第二个实例定时时间为 2017-07-16 01:00:00,则:bdp.system.bizdate 替换的结果为 20170715;bdp.system.cyctime 替换的结果为 20170716010000。

    • 以此类推,第 24 个实例定时时间为 2017-07-16 23:00:00,则:bdp.system.bizdate 替换的结果为 20170715;bdp.system.cyctime 替换的结果为 20170716230000。

自定义参数

使用自定义参数的场景:

  • 非 Shell 类型的脚本或任务:需要先在代码中编辑 ${key1},${key2},然后在 参数 编辑框输入 “key1=value1 key2=value2” 方可生效。
  • Shell 类型的脚本或任务:需要先在代码中编辑 $1 $2 $3,然后在 参数 编辑框 “value1 value2 value3” 方可生效。

其中,value 的计算分为两种类型:

  • 常量:直接替换的字符串或数字,例如“key1=1234 key2=abcdefg”。
  • 变量:基于 bdp.system.cyctime 取值计算出的取值,例如“key1=$[yyyy]”表示按 bdp.system.cyctime 的值取年的部分作为结果替换该参数。

关于 bdp.system.cyctime 的取值,请参见系统参数的说明。

可供参考的变量参数配置方式如下:

  • 后N年:$[add_months(yyyymmdd,12*N)]
  • 前N年:$[add_months(yyyymmdd,-12*N)]
  • 后N月:$[add_months(yyyymmdd,N)]
  • 前N月:$[add_months(yyyymmdd,-N)]
  • 后N周:$[yyyymmdd+7*N]
  • 前N周:$[yyyymmdd-7*N]
  • 后N天:$[yyyymmdd+N]
  • 前N天:$[yyyymmdd-N]
  • 后N小时:$[hh24miss+N/24]
  • 前N小时:$[hh24miss-N/24]
  • 后N分钟:$[hh24miss+N/24/60]
  • 前N分钟:$[hh24miss-N/24/60]

注意

  • 请以中括号 [] 编辑自定义变量参数的取值计算公式,例如 key1=$[yyyy-mm-dd]。
  • 默认情况下,自定义变量参数的计算单位为天。例如 $[hh24miss-N/24/60] 表示 (yyyymmddhh24miss-(N/24/60 * 1天)) 的计算结果,然后按 hh24miss 的格式取时分秒。
  • 使用 add_months 的计算单位为月。例如 $[add_months(yyyymmdd,12 N)-M/24/60] 表示 (yyyymmddhh24miss-(12 N 1月))-(M/24/60 1天) 的结果,然后按 yyyymmdd 的格式取年月日。

ODPS_SQL 天调度任务示例

设置一个 ODPS_SQL 类型的任务为按天调度,每天 01:00 执行一次,若想在代码中使用一个自定义常量参数 tablename 和一个自定义变量参数 ct,则可按如下步骤进行操作:

  1. 在代码中引用自定义变量名。

    1. insert overwrite table ${tablename} partition(ds=${ct}) select
    2. c1,c2,c3
    3. from (
    4. select * from tb2
    5. where ds ='${bdp.system.cyctime}')
    6. full outer join(
    7. select * from tb3
    8. where ds = '${bdp.system.bizdate}') y
    9. on t.c1 = y.c1;
  2. 设置时间周期为每天 1 点运行。

  3. 参数 编辑框设置自定义参数的计算公式。

    1

  4. 查看系统运行的实例日志。

    有 4 种方式可以触发运行,其中 3 种可以生成实例,详情请参见 数据开发概述。生成实例的运行模式可以比较好的观察到系统对参数的计算。

    以系统周期自动运行为例,代码提交后第二天在运维中心可以看到系统自动按时间周期生成的运行实例。

    例如在 2017 年 07 月 17 日这一天,调度系统为该任务生成了 1 个运行实例。运行日期应当全部为 2017 年 07 月 17 日(生成实例当天),因此 ${bdp.system.cyctime} 取值应当为 20170717。

    此时打开实例的运行日志,可以看到代码中 ${tablename} 被替换为常量 t_table_001,${ct}被替换为 2017-07-15,也就是业务日期的前两天。

小时调度任务示例

设置一个 ODPS_SQL 任务为按小时调度,每天 00:00-23:59 时间段里每隔 1 小时执行一次,想要在代码中使用两个关于小时的自定义变量参数 thishour 和 lasthour,则应当按如下操作:

  1. 在代码中引用自定义变量名。

    1. insert overwrite table tb1 partition(ds ='20150304') select
    2. c1,c2,c3
    3. from (
    4. select * from tb2
    5. where ds ='${thishour}') t
    6. full outer join(
    7. select * from tb3
    8. where ds = '${lasthour}') y
    9. on t.c1 = y.c1;
  2. 配置时间周期为每隔 1 小时运行一次。

  3. 参数 编辑框设置自定义参数的计算公式。

    自定义参数配置如下:

    • thishour=$[yyyy-mm-dd/hh24:mi:ss]

    • lasthour =$[yyyy-mm-dd/hh24:mi:ss-1/24]

  4. 查看系统运行的实例日志。

    有 4 种方式可以触发运行,其中 3 种可以生成实例,详情请参见 数据开发概述。生成实例的运行模式可以比较好的观察到系统对参数的计算。

    以系统周期自动运行为例,代码提交后第二天在运维中心可以看到系统自动按时间周期生成的运行实例。例如在 2017 年 07 月 16 日这一天,系统应当为该任务生成 24 个实例。运行日期为 2017 年 07 月 16 日(生成实例当天),因此 ${bdp.system.cyctime} 取值应当为 20170716。

    此时打开各实例的运行日志,应当看到如下替换结果:

    • 第一个实例定时时间为 2017-07-16 00:00:00,那么 thishour 替换的结果为 2017-07-16/00:00:00,lasthour 替换的结果为 2017-07-15/23:00:00。

    • 第二个实例定时时间为 2017-07-16 01:00:00,那么 thishour 替换的结果为 2017-07-16/01:00:00,lasthour 替换的结果为 2017-07-16/00:00:00。

    • 以此类推第 24 个实例定时时间为 2017-07-16 23:00:00,那么 thishour 替换的结果为 2017-07-16/23:00:00,lasthour 替换的结果为 2017-07-16/22:00:00。

Shell 天调度任务示例

设置一个 Shell 类型的任务为按天调度,每天 01:00 执行一次,若想在代码中使用一个自定义常量参数 myname 和一个自定义变量参数 ct,则可按如下步骤进行操作:

  1. 在代码中引用自定义变量名。

    其中的代码如下:

    1. echo "hello $1, two days ago is $2, the system param is ${bdp.system.cyctime}";
  2. 设置时间周期为每天 1 点运行。

    11-11

  3. 参数 编辑框设置自定义参数的计算公式。

    系统参数无需提供计算公式,自定义参数需要按 $value1 $value2 $value3。

    11-12

  4. 查看系统运行的实例日志。

    有 4 种方式可以触发运行,其中 3 种可以生成实例,详情请参见 数据开发概述。生成实例的运行模式可以比较好的观察到系统对参数的计算。

    以系统周期自动运行为例,代码提交后第二天在运维中心可以看到系统自动按时间周期生成的运行实例。

    例如在 2017 年 07 月 17 日这一天,调度系统为该任务生成了 1 个实例。运行日期应当全部为 2017 年 07 月 17 日(生成实例当天),因此 ${bdp.system.cyctime} 取值应当为 20170717。

    此时打开实例的运行日志,可以看到代码中 $1 被替换为常量 abcd,$2 被替换为 2017-07-15,也就是运行日期的前两天, ${bdp.system.cyctime} 被替换为 20170717010000。

常见问题

  • Q: 表的分区格式为 pt=yyyy-mm-dd hh24:mi:ss,但是调度参数中不允许配置空格,我该如何配置$[yyyy-mm-dd hh24:mi:ss]的格式呢?

    A: 使用两个自定义变量参数 datetime=$[yyyy-mm-dd]、 hour=$[hh24:mi:ss],分别获取日期和时间,然后在代码中拼接为 pt=”${datetime} ${hour}” (注意拼接的两段自定义参数之间需要空格隔开)。

  • Q: 在代码中表的分区为 pt=”${datetime} ${hour}”,希望执行的时侯取上个小时的数据。使用两个自定义变量参数 datetime=$[yyyymmdd]、 hour=$[hh24-1/24],分别获取日期和时间可以满足需求。但是 0 点运行的实例,计算结果会变成当天的 23 点,实际应当是前一天的 23 点,怎么办?

    A: 参数的计算公式稍作修改,datetime 修改为 $[yyyymmdd-1/24],hour 的计算公式不变仍为 $[hh24-1/24]。计算结果如下,即可满足需求:

    如果一个实例的定时时间是2015-10-27 00:00:00,减1小时就是昨天,所以$[yyyymmdd-1/24]的值是20151026,$[hh24-1/24]的值是23;

    如果一个实例的定时时间为2015-10-27 01:00:00的实例,减1小时还是今天,所以$[yyyymmdd-1/24]的值是20151027,$[hh24-1/24]的值是00;

大数据开发套件提供了 4 种运行方式,详情请参见 数据开发概述。这四种方式下系统参数计算方式如下:

  • 数据开发页面运行:需要在参数配置页面 临时 赋值以保证运行。但该赋值不会保存为任务的属性,因此不会对其他3种运行方式起作用。

  • 系统自动周期运行:不需要在参数编辑框做任何配置,调度系统会根据当前实例的定时运行时间自动替换。

  • 测试运行/补数据运行:触发时需要指定 业务日期,可根据上述计算公式推断定时运行时间,从而得知各实例中这两个系统参数的取值。

本文导读目录
本文导读目录
以上内容是否对您有帮助?