处理oozie工作流程中的循环

Sac*_*inJ 4 hadoop oozie

我有一个用于检查输入数据可用性的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" />
Run Code Online (Sandbox Code Playgroud)

只有当我执行工作流程时,我才知道oozie不支持循环,因为它的工作流程是DAG.得到错误错误:E0707:E0707:在解析workflow.xml时解析时检测到循环,节点[datacheck]

处理这个用例有什么不同的方法吗?

任何帮助表示赞赏.

Hel*_*ann 7

您可以使用递归模拟循环.关键思想是工作流使用子工作流操作调用自身,该子工作流操作指向包含操作节点的工作流文件.

必须使用决策节点停止递归.

在我的博客上,您可以找到完整的示例.