Datastage 循环调度作业实例

浏览: 4347

版本:IBM InfoSphere DataStage V11.3.1

操作系统:linux redhat 6.4

需求场景

最近数据库在做迁移,同时需要对新迁移程序进行初始化。初始化跑批作业由存储过程调用执行,同时需要输入特定的参数。

如果基于目前开发DS作业,会遇到如下问题:

需要手动去输入参数,同时也需要等该作业跑完之后,在输入下一个参数去跑。这样我们会耗费时间去不停的输入参数,同时如果忘记前一个参数会造成数据错误。

当然主要还是想自动化。所以需要开发一个,支持循环调度,同时可以获取不同参数的作业。

控件讲解:

支持循环,Sequence Job 通过 StartLoop Activity Stage 和 EndLoop Activity Stage 提供了循环的功能。循环变量可以是基于起始值,结束值和步长的整数循环,也可以基于给定的列表进行循环,还可以把这些循环中的临时变量传递给每个具体的循环步骤。在 StartLoop Activity Stage 和 EndLoop Activity Stage 之间,可以加入任意多个的

实现方式:

数据库准备:

创建存储过程rpoc_m_act_loan_out_m  需要输入参数 i_date


begin
-- Call the procedure
rpoc_m_act_loan_out_m(i_date => :i_date);
end;


开发Sequence Job :

Clipboard Image.png


在StartLoop_Activity_1 设置如下:

Clipboard Image.png


RPOC_M_ACT_LOAN_OUT_M  引用变量,设设置如下:

Clipboard Image.png


查看日志:

DS会把这八个参数20120228,20130630,20130731,20130831,20130930,20131031,20131130,20131231分为八个作业来进行依此调度。可以从日志中得到


 Message: CopyOfQ_HGZ_VJK_WBFK_GZB..JobControl (@Coordinator): Summary of sequence run
14:04:06: Sequence started
14:04:06: StartLoop_Activity_8 loop iteration 1 started
14:04:06: Job_Activity_10 (JOB RPOC_M_ACT_LOAN_OUT_M) started
14:04:08: Job_Activity_10 (JOB RPOC_M_ACT_LOAN_OUT_M) finished, status=1 [Finished OK]
14:04:08: StartLoop_Activity_8 loop iteration 2 started
14:04:08: Job_Activity_10 (JOB RPOC_M_ACT_LOAN_OUT_M) started
14:04:11: Job_Activity_10 (JOB RPOC_M_ACT_LOAN_OUT_M) finished, status=1 [Finished OK]
14:04:11: StartLoop_Activity_8 loop iteration 3 started
14:04:11: Job_Activity_10 (JOB RPOC_M_ACT_LOAN_OUT_M) started
14:04:14: Job_Activity_10 (JOB RPOC_M_ACT_LOAN_OUT_M) finished, status=1 [Finished OK]
14:04:14: StartLoop_Activity_8 loop iteration 4 started
14:04:14: Job_Activity_10 (JOB RPOC_M_ACT_LOAN_OUT_M) started
14:04:17: Job_Activity_10 (JOB RPOC_M_ACT_LOAN_OUT_M) finished, status=1 [Finished OK]
14:04:17: StartLoop_Activity_8 loop iteration 5 started
14:04:17: Job_Activity_10 (JOB RPOC_M_ACT_LOAN_OUT_M) started
14:04:20: Job_Activity_10 (JOB RPOC_M_ACT_LOAN_OUT_M) finished, status=1 [Finished OK]
14:04:20: StartLoop_Activity_8 loop iteration 6 started
14:04:20: Job_Activity_10 (JOB RPOC_M_ACT_LOAN_OUT_M) started
14:04:24: Job_Activity_10 (JOB RPOC_M_ACT_LOAN_OUT_M) finished, status=1 [Finished OK]
14:04:24: StartLoop_Activity_8 loop iteration 7 started
14:04:24: Job_Activity_10 (JOB RPOC_M_ACT_LOAN_OUT_M) started
14:04:27: Job_Activity_10 (JOB RPOC_M_ACT_LOAN_OUT_M) finished, status=1 [Finished OK]
14:04:27: StartLoop_Activity_8 loop iteration 8 started
14:04:27: Job_Activity_10 (JOB RPOC_M_ACT_LOAN_OUT_M) started
14:04:30: Job_Activity_10 (JOB RPOC_M_ACT_LOAN_OUT_M) finished, status=1 [Finished OK]
14:04:30: EndLoop_Activity_9 loop finished
14:04:30: Sequence finished OK

控件说明:

StartLoop Activity 阶段标记循环的起点并对其进行了定义。

除了“常规”和“触发器”页面,StartLoop Activity 的“属性”对话框还包含 StartLoop 页面。

您可具有数字循环(可在其中定义计数器、限制和增量值),或具有列表循环(可在其中对列表中的每一项执行一次循环)。您可以将当前计数器值作为参数(格式为stage_label.$Counter)传递到循环中的阶段,其中 stage_label 是“图”窗口中给出的 StartLoop Activity 阶段的名称。使用 EndLoop Activity 阶段可标记循环的末尾,它具有一条连接到其相应 StartLoop Activity 阶段的链接。

如果需要,那么可以嵌套循环。

在 StartLoop 页面中定义循环设置。该页面包含:

  • 循环类型。选择“数字”可实施“For...Next”类型的循环,选择“列表”可实施“For...Each”类型的循环。

选择“数字”时,该页面包含以下字段:

  • 初始值。计数器的初始值。
  • 增量值。计数器的增量值。
  • 最终值。最终计数器值。

您可以对任何一个字段使用参数,并在运行时指定实际值。可单击“浏览”按钮以打开“外部参数帮助程序”,它显示了此时在作业序列中可用的所有参数。在该字段中输入的参数需要使用井号(#)来定界。从“外部参数帮助程序”选择的参数都将自动括在两个井号之间。

选择“列表”时,该页面具有不同的字段:

  • 定界值。输入列表,使用选定的定界符分隔其中的每一项。
  • 定界符。指定将用来分隔列表项的定界符。可从以下几项中进行选择:
    • 逗号(缺省值)
    • 空格
    • 其他(在文本字段中输入所需字符)

相关作业

推荐 2
本文由 我是最优雅的杀手,不杀人专杀狗 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

3 个评论

在StartLoop_Activity_1 设置中参数多可以放入csv中,请问应该怎么设置,一直尝试不成功,求大神指教
有两个Job Activity,Job1、Job2,Job2基于Job1的结果判断是否执行,如果Job1返回的结果是1则继续执行Job2,否则结束。请问大神这个应该怎么控制?
我之前是通过货DS的日志信息表来控制的,比如Job1 跑完之后,会有一个状态数据比如1,获取之后写Shell 来调度实现。

要回复文章请先登录注册