我有一个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]处检测到循环
处理这个用例有什么不同的方法吗?
感谢您的帮助。
3条答案
按热度按时间vc9ivgsu1#
您可以使用子工作流概念来实现循环。其思想是将要重复的操作提取到子流中,并根据需要多次从主流中调用它。阅读更多:操作方法:缩短oozie工作流定义
c9x0cxw02#
dag=有向无环图。这意味着工作流形成的图形中不能有任何循环(循环)。
http://en.wikipedia.org/wiki/directed_acyclic_graph
eblbsuwk3#
可以使用递归模拟循环。关键思想是,工作流使用指向包含动作节点的工作流文件的子工作流动作调用自身。
必须使用决策节点停止递归。
在我的博客上你可以找到一个完整的例子。