我有一个工作流程,它看起来像下面。
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>
类似于这种方式,你需要替换你的每个动作。对子工作流进行参数化,这样它就可以被同一类型的动作重复使用。
请注意,我创建了两个动作,一个是成功动作,一个是失败动作。这是因为如果发送状态的动作失败了,你希望你的工作流能够继续。所以,对于errorno-error 的 send-success
你的工作流程应该继续;同样的,你的 send-failure
它将杀死子工作流。
我试着用 决定节点. 但没有运气。所以只能选择创建两个独立的动作。即使你可以使用相同的脚本 your-rest-script.sh
作为 MESSAGE_TO_SEND
是两个动作的参数。使用javapython-shell动作的流程是一样的。