4

入力データの可用性をチェックし、データの可用性に基づいて mapreduce ジョブをトリガーするための Oozie ユース ケースがあります。そこで、入力データをチェックするためのシェルスクリプトを書いて、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" />

ワークフローを実行して初めて、ワークフローが DAG であるため、oozie がサイクルをサポートしていないことがわかりました。エラー Error: E0707 : E0707: loop detected at parsing, node [datacheck] while parsing workflow.xml

このユースケースを処理するための別のアプローチはありますか?

どんな助けでも大歓迎です。

4

3 に答える 3

7

再帰を使用してループをシミュレートできます。重要なアイデアは、アクション ノードを含むワークフロー ファイルを指すサブワークフロー アクションを使用して、ワークフローがそれ自体を呼び出すことです。

決定ノードを使用して再帰を停止する必要があります。

私のブログでは、この完全な例を見つけることができます。

于 2015-04-23T19:45:52.243 に答える