Hil*_*rin 7 parallel-processing workflow fork join oozie
我在Oozie中使用fork/join,以便并行一些子工作流操作.我的workflow.xml如下所示:
<workflow-app name="myName" xmlns="uri:oozie:workflow:0.5"
<start to="fork1"/>
<kill name="Kill">
<message>Action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
</kill>
<fork name="fork1">
<path start="subworkflow1"/>
<path start="subworkflow2"/>
</fork>
<join name="Completed" to="End"
<action name="subworkflow1">
<sub-workflow>
<app-path>....</app-path>
<propagate-configuration/>
<configuration>
<property>
<name>....</name>
<value>....</value>
</property>
</configuration>
</sub-workflow>
<ok to="Completed"/>
<error to="Completed"/>
</action>
<action name="subworkflow2">
<sub-workflow>
<app-path>....</app-path>
<propagate-configuration/>
<configuration>
<property>
<name>....</name>
<value>....</value>
</property>
</configuration>
</sub-workflow>
<ok to="Completed"/>
<error to="Completed"/>
</action>
<end name="End"></workflow-app>
Run Code Online (Sandbox Code Playgroud)
当subworkflow1被杀死时(由于某种原因失败),它也会杀死subworkflow2.我希望这两个动作是平行的,但不依赖.
在我的工作流程中,当workflow1被杀死时,我看到workflow2也被杀死了,但我的应用程序成功了(我在Oozie仪表板上检查它 - > HUE中的工作流程).
在这种情况下,我希望subworkflow1将被杀死,subworkflow2将成功,我真的不关心我的整个应用程序会说什么.
我应该怎么做才能使每个路径获得它自己的状态并继续运行,即使同一个fork中的其他路径被杀死了?
小智 7
我最近也遇到过这个问题.找到了让oozie表现我想要的方法.
您的分叉操作的错误值可能等于您的连接名称.这将跳过该特定分叉执行路径中的任何后续操作.然后,您的联接的"to"值可以将控制发送到决策节点.该决策节点应该检查的值wf:lastErrorNode().如果值为空字符串,请继续根据需要处理工作流程.如果该值不是空字符串,则发生错误,您可以将控制发送到kill节点.
这是一个例子:
<start to="forkMe"/>
<fork name="forkMe">
<path start="action1"/>
<path start="action2"/>
</fork>
<action name="action1">
...
<ok to="joinMe"/>
<error to="joinMe"/>
</action>
<action name="action1">
...
<ok to="joinMe"/>
<error to="joinMe"/>
</action>
<join name="joinMe" to="decisionMe"/>
<decision name="decisionMe">
<switch>
<case to="end">
${wf:lastErrorNode() eq ""}
</case>
<default to="error-mail"/>
</switch>
</decision>
<action name="error-mail">
...
<ok to="fail"/>
<error to="fail"/>
</action>
<kill name="fail">
<message>Job failed:
message[${wf:errorMessage(wf:lastErrorNode())}]
</message>
</kill>
<end name="end"/>
Run Code Online (Sandbox Code Playgroud)
小智 0
几种处理方法。
1)您可以独立提交这2个子工作流程,而不是包含它们的大工作流程。
2)子工作流1增加重试,子工作流2在子工作流1上次失败之前不会被杀死。如果设置了较长的重试间隔,那么当 1 上次失败时 2 已经完成,并且 2 的状态将保持 ok。Kill 不会影响状态为 ok 的操作。
对于这个问题。在我的工作流程中,当工作流程 1 被终止时,我看到工作流程 2 也被终止,但我的应用程序成功了(我在 Oozie 仪表板 -> HUE 中的工作流程上检查它)。
答:(
<error to="Completed"/>
如果已完成的节点最终没有到达终止节点)此设置将使 oozie 认为工作流程已成功完成,即使发生此操作时出现错误。
| 归档时间: |
|
| 查看次数: |
3966 次 |
| 最近记录: |