【问题标题】:Handling loops in oozie workflow处理 oozie 工作流程中的循环
【发布时间】:2013-07-16 18:49:34
【问题描述】:

我有一个 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]

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

感谢任何帮助。

【问题讨论】:

标签: hadoop oozie


【解决方案1】:

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

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

在我的博客上你可以找到a complete example

【讨论】:

    【解决方案2】:

    DAG = 有向 非循环 图。这意味着您的工作流程形成的图表中不能有任何个循环(循环)。

    http://en.wikipedia.org/wiki/Directed_acyclic_graph

    【讨论】:

    • 没关系,oozie 工作流不应该包含任何循环。有没有其他方法来处理这个用例?
    • 这是一个很棒的用例。看看这个问题被浏览了多少次?在我写这篇文章时有 1523 次。
    【解决方案3】:

    您可以使用子工作流概念来实现循环。这个想法是将要重复的动作提取到子流中,并根据需要从主流中多次调用它。在这里阅读更多:How-to: Shorten Your Oozie Workflow Definitions

    【讨论】:

    • 链接下来:((((((
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-11
    • 1970-01-01
    • 2014-08-24
    相关资源
    最近更新 更多