当一个人被杀时,Oozie分叉会杀死所有行动

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将成功,我真的不关心我的整个应用程序会说什么.

  • 在我的情况下,subworkflow1需要比subworkflow2更长的时间,所以当我检查我的应用程序结束时,我看到虽然它说subworkflow1 + 2被杀了,我的应用程序成功了,但真正发生的是subworkflow2完成了它的部分,即使,它后来被杀死了(它继续"运行",直到叉子的所有路径完成它们的运行).所以workflow2完成了它的部分而不是被杀死因为workflow1被杀了...

我应该怎么做才能使每个路径获得它自己的状态并继续运行,即使同一个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 认为工作流程已成功完成,即使发生此操作时出现错误。