我有一个用于检查输入数据可用性的oozie用例,并根据数据的可用性触发mapreduce作业。 所以我写了一个shell脚本来检查输入数据并在oozie中为它创建了一个ssh动作,
输入数据检查的重试次数和重试间隔应该是可配置的,并且每次重试后如果数据仍然丢失,我必须发送警报,经过指定的重试次数,mapreduce作业可以从可用数据开始
我写了一个工作流程如下:
<start to="datacheck" />
<action name="datacheck">
<ssh xmlns="uri:oozie:ssh-action:0.1">
<host>${sshUserHost}</host>
<command>${Oozieutilsscript}</command>
</ssh>
<ok to="datacheckswitch" />
<error to="fail" />
</action>
<decision name="datacheckswitch">
<switch>
<case to="mapreduce">${(wf:actionData('datacheck')['datatransfer'] == "complete" )}</case>
<case to="retry">${(wf:actionData('datacheck')['datatransfer'] == "incomplete" )}</case>
<default to="fail" />
</switch>
</decision>
<action name="retry">
<ssh xmlns="uri:oozie:ssh-action:0.1">
<host>${sshUserHost}</host>
<command>${Oozieutilsscript1}</command>
</ssh>
<ok to="retryswitch" />
<error to="fail" />
</action>
<decision name="retryswitch">
<switch>
<case to="datacheck">${(wf:actionData('datacheck')['retry'] == "notfinished" )}</case>
<case to="datacheck">${(wf:actionData('datacheck')['retry'] == "finished" )}</case>
<default to="fail" />
</switch>
</decision>
<action name="mapreduce">
...............
</action>
<!--Kill and End portion-->
<kill name="fail">
<message>Java failed, error message[${wf:errorMessage(wf:lastErrorNode())}</message>
</kill>
<end name="end" />
只有当我执行工作流程时,我才知道oozie不支持循环,因为它的工作流程是DAG。得到错误错误:E0707:E0707:解析时检测到循环,解析workflow.xml时节点[datacheck]
处理这个用例有什么不同的方法吗?
感谢任何帮助。
答案 0 :(得分:7)
答案 1 :(得分:2)
DAG =定向非循环图表。这意味着您的工作流程形成的图表中不会有任何周期(循环)。
答案 2 :(得分:2)
您可以使用子工作流概念实现循环。我们的想法是将要重复的动作提取到子流中,并根据需要从主流中调用它。在此处阅读更多内容:How-to: Shorten Your Oozie Workflow Definitions