join - Oozie fork 在一个被杀死时杀死所有 Action

标签 join parallel-processing workflow fork oozie

我在 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 会成功,而且我并不在乎我的整个应用程序会说什么。
  • 就我而言,subworkflow1 花费的时间比 subworkflow2 长,所以当我在它结束时检查我的应用程序时,我看到虽然它说 subworkflow1+2 被杀死了,我的应用程序成功了,但真正发生的是 subworkflow2 完成了它的部分,即使,它稍后被杀死(它保持“运行”直到 fork 的所有路径完成它们的运行)。所以工作流2完成了它的部分,然后被杀死,因为工作流1被杀死了...

  • 我应该怎么做才能使每个路径获得自己的状态并继续运行,即使同一个分支中的其他路径被杀死?

    最佳答案

    我最近也遇到了这个问题。找到了一种让 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/

    相关文章:

    c++ - 尝试使用移动语义创建线程 guard

    matlab - 在外部 for 中使用 parfor 的两个循环错误

    javascript - 如何访问 Javascript GitHub 操作中的 secret ?

    dynamics-crm - 自定义工作流事件不更新输入参数

    snowflake-cloud-data-platform - 如何设置开发人员以在雪花(和 dbt)上生产工作流程?

    mysql - 在 MySQL 中计算交叉表的有效方法是什么?

    java - 为什么 hibernate 在最后添加到我的查询交叉连接

    python - 如何避免唯一键在 PySpark left join 中出现两次

    sql - 如何使用连接而不是两个子查询

    c++ - 优化计算时间