【问题标题】:Oozie fork call same action multiple timesOozie fork 多次调用相同的操作
【发布时间】:2018-07-05 23:17:28
【问题描述】:

我正在尝试使用 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 复制到三个不同的操作performAction1performAction2performAction3 并在分叉中使用它们。现在工作流程正在完成,因为joinForks 被所有分支调用。但是,我真的希望我不必以不同的名称一次又一次地重复相同的操作。任何帮助表示赞赏。

谢谢

【问题讨论】:

  • 请提供您的工作流程/配置文件。
  • @codeaperature 提供了示例工作流文件。感谢观看

标签: oozie oozie-workflow


【解决方案1】:

我怀疑您收到的错误消息是因为此代码:

<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 个同名的分叉会抛弃唯一命名的转换要求。

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

【讨论】:

  • 感谢您回来。正如我在附加说明中提到的,这确实对我有用,可以添加具有不同名称的多个操作。我只是想不重复。如果您对如何实现这一目标有任何想法,请告诉我。可以声明一个公共模块并在每个操作中继承它吗?
  • 我认为这不可能,动作应该有唯一的命名
  • @mangusta 是的,这是真的。因此,我想做的是,将动作主体(火花动作)定义为某个部分,并将该部分导入多个动作中,这样我就可以防止重复该部分。但是不知道怎么定义。
  • @sriram 您可能会查看 oozie “子工作流”概念,尽管我不确定这是否正是您正在寻找的。 “子工作流”用于调用在主工作流中重复多次的工作流的一部分,即类似于编程语言中的函数或方法或过程。它可以显着缩短并简化主要工作流程
  • @mangusta 是的,子工作流程是要走的路。我也提到了其他例子。这种情况是作为子工作流实现的。感谢您回来。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-28
相关资源
最近更新 更多