如何 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 操作流程将相同。
我的工作流程如下所示。
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 操作流程将相同。