我在 Oozie 中使用 fork/join,以便并行一些子工作流操作。
我的工作流.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>
当 subworkflow1 被杀死(由于某种原因失败)时,它也会杀死 subworkflow2。我希望这两个 Action 是平行的,但不是相互依赖的。
在我的工作流中,当工作流1被终止时,我看到工作流2也被终止了,但我的应用程序成功了(我在Oozie仪表板-> HUE中的工作流上检查了它)。
在这种情况下,我希望 subworkflow1 会被终止,subworkflow2 会成功,而且我并不在乎我的整个应用程序会说什么。
我应该怎么做才能使每个路径获得自己的状态并继续运行,即使同一个分支中的其他路径被杀死?
最佳答案
我最近也遇到了这个问题。找到了一种让 oozie 表现得像我想要的那样的方法。
您的 fork 操作可能具有与您的连接名称相同的错误值。这将跳过该特定 fork 执行路径中的任何后续操作。然后,您加入的“to”值可以将控制权发送到决策节点。该决策节点应检查 wf:lastErrorNode()
的值.如果值为空字符串,则根据需要继续处理工作流。如果该值不是空字符串,则发生错误,您可以发送控制来杀死节点。
下面是一个例子:
<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"/>
关于join - Oozie fork 在一个被杀死时杀死所有 Action ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31292341/