1

我正在尝试使用 fork 并行运行相同 oozie 操作的多个实例。在尝试这样做时,我适时收到错误说明

"E0744" 一个分叉不允许有多个过渡到同一个节点

我还查看了 oozie 代码库(LiteWorkflowAppParser),发现 oozie 确实不允许在 fork 中多次运行调用相同的操作,因为它对此进行了验证。现在我禁用了验证oozie.wf.validate.ForkJoin=false并再次运行工作流程。这一次,工作流运行良好,但只有一个动作实例在运行。对我来说,虽然我禁用了验证,但下面的 oozie 只允许运行独特的操作,并且跳过了重复的操作。现在我的问题是,如何实现并行运行多个 oozie 动作?

我的工作流程是这样的:

<workflow-app xmlns="uri:oozie:workflow:0.4" name="my-workflow">
   <start to="parallelize"/>
   <fork name="parallelize">
      <path start="performAction" />
      <path start="performAction" />
      <path start="performAction" />
   </fork>
<action name="performAction">
.......
  <ok to="joinForks"/>
  <error to="fail"/>
</action>
<join name="joinForks" to="end" />
<kill name="fail">
    <message>Responder Application, error
        message[${wf:errorMessage(wf:lastErrorNode())}]
    </message>
</kill>
<end name="end"/>
</workflow-app>

附加细节: 通过上述配置,我看到工作流performAction在过渡到joinForks阶段完成后卡住了。看起来它joinForks正在等待剩余的操作向它报告,以便它可以结束。但问题是,剩余的操作从未启动,导致工作流无限期地等待。

在此之后,我只是复制performAction到三个不同的 actionperformAction1performAction2performAction3并在 forks 中使用它们。现在工作流程正在完成,因为joinForks所有分支都调用了它。但是,我真的希望我不必以不同的名称一次又一次地复制相同的操作。任何帮助表示赞赏。

谢谢

4

1 回答 1

0

我怀疑您收到的错误消息是由于以下代码:

<fork name="parallelize">
  <path start="performAction" />
  <path start="performAction" />
  <path start="performAction" />
</fork>

<action name="performAction">
  ...
  <ok to="joinForks"/>
  <error to="fail"/>
</action>

我怀疑叉子必须具有唯一的名称,如下所示:

<fork name="parallelize">
  <path start="performAction1" />
  <path start="performAction2" />
  <path start="performAction3" />
</fork>
<action name="performAction1"> 
  ...
  <ok to="joinForks"/>
  <error to="fail"/>
</action>
<action name="performAction2">
  ...
  <ok to="joinForks"/>
  <error to="fail"/>
</action>
<action name="performAction3"> 
  ...
  <ok to="joinForks"/>
  <error to="fail"/>
</action>

似乎拥有 3 个具有相同名称的分叉正在抛弃唯一命名的转换要求。

您可以尝试使用唯一命名的单个分叉吗?

于 2018-07-09T17:44:40.170 回答