如何 POST REST API 来自 oozie 工作流的消息

How to POST REST API Messages from oozie workflows

我的工作流程如下所示。

start = fork1
<fork1/>
   <action1>
   <action2>
 <fork1>
 <join1 to fork2>
  <fork2/>
    <action3>
   <action4>
  <fork2>..

....
....
<join 75 to fork 76>
 <fork76>
     <action 987>
     <action 988>
  <fork76/>
 <join 76 to "END">

每个动作有2个结束节点。

我想按照下面的方式修改。

<OK > to post a "SUCCESS" message to REST endpoint and then to proceed to next_join_number.
<ERROR> to post "FAILURE" message to REST endpoint and then to proceed email & kill action.

但我不确定如何使它成为通用的并实现它。我能想到的唯一方法是编写 988 个单独的操作来发送状态消息并附加到操作。

为每个操作创建一个子工作流程。

每个动作(比方说 Spark)都有一个单独的工作流程。并且你将有 2 个额外的动作(可能是 Shell 动作)。

<workflow-app name="spark-subworkflow" xmlns="uri:oozie:workflow:0.4">
    ... # configs
    <start to="special-spark"/>
    <action name="special-spark">
        <spark>
            ...
        </spark>
        <ok to="send-success"/>
        <error to="send-failure"/>
    </action>
    <action name="send-success">
        <shell>
            <job-tracker>[JOB-TRACKER]</job-tracker>
            <name-node>[NAME-NODE]</name-node>
            <exec>script-to-run.sh</exec>
            <env-var>MESSAGE_TO_SEND=SUCCESS</env-var>
            <file>hdfs:///path-to-script/your-rest-script.sh#script-to-run.sh</file>
        </shell>
        <ok to="end"/>
        <error to="end"/>
    </action>
    <action name="send-failure">
        <shell>
            <job-tracker>[JOB-TRACKER]</job-tracker>
            <name-node>[NAME-NODE]</name-node>
            <exec>script-to-run.sh</exec>
            <env-var>MESSAGE_TO_SEND=FAILURE</env-var>
            <file>hdfs:///path-to-script/your-rest-script.sh#script-to-run.sh</file>
        </shell>
        <ok to="kill"/>
        <error to="kill"/>
    </action>
</workflow-app>

这种方式你需要替换你的每一个动作。参数化子工作流,以便它可以重复用于相同类型的操作。

请注意,我创建了 2 个动作,一个来自成功,一个来自失败。那是因为如果发送状态的操作失败,您希望您的工作流程继续。因此,对于 send-success 个操作中的 error/no-error 个,您的工作流程应该继续; send-failure 也一样,它会杀死子工作流。

我尝试使用 Decision Node 来实现它。但没有运气。所以只能选择创建 2 个单独的操作。甚至认为您可以使用相同的脚本 your-rest-script.sh 因为 MESSAGE_TO_SEND 是这两个操作的参数。使用 java/python-shell 操作流程将相同。