как обрабатывать очистку ошибок отдельно для параллельных заданий в oozie

Мне нужно запустить набор параллельных заданий в oozie, которые я могу запустить, используя опцию fork в oozie. Теперь проблема, с которой я сталкиваюсь, заключается в том, что если одно задание завершается с ошибкой, остальные задания также терпят неудачу, потому что я вызываю узел управления уничтожением при ошибке для каждого отдельного задания. Я много искал в Интернете, но не смог найти, как справиться с очисткой ошибок отдельно для каждого задания.

Любая помощь будет оценена по достоинству.

Мой рабочий процесс.xml выглядит следующим образом:

<workflow-app name="WorkFlowForSshAction" xmlns="uri:oozie:workflow:0.1">
<start to="copyfroms3tohdfs"/>
<action name="copyfroms3tohdfs">
<ssh xmlns="uri:oozie:ssh-action:0.1">
<host>${CMNodeLogin}</host>
<command>${s3tohdfsscript}</command>
<capture-output/>
</ssh>
<ok to="createhivetables"/>
<error to="killAction"/>
</action>


<action name="createhivetables">
<ssh xmlns="uri:oozie:ssh-action:0.1">
<host>${CMNodeLogin}</host>
<command>${createhivetablesscript}</command>
<capture-output/>
</ssh>
<ok to="gold__pos_denorm_trn_itm_offr"/>
<error to="killAction"/>
</action>
<action name="gold__pos_denorm_trn_itm_offr">
<ssh xmlns="uri:oozie:ssh-action:0.1">
<host>${CMNodeLogin}</host>
<command>${denormalizationscript}</command>
<capture-output/>
</ssh>
<ok to="forknode"/>
<error to="killAction"/>
</action>
<fork name="forknode">
        <path start="gold__dypt_pos_trn_offr"/>
        <path start="gold__hr_pos_trn_offr"/>
                <path start="approach3"/>
                <path start="aproach11"/>
                <path start="aproach12"/>
                <path start="aproach13"/>
                <path start="aproach14"/>
                <path start="aproach15"/>
                <path start="aproach16"/>
                <path start="aproach17"/>

</fork>
<action name="gold__dypt_pos_trn_offr">
<ssh xmlns="uri:oozie:ssh-action:0.1">
<host>${CMNodeLogin}</host>
<command>${daypartscript}</command>
<capture-output/>
</ssh>
<ok to="joinnode"/>
<error to="killAction"/>
</action>
<action name="gold__hr_pos_trn_offr">
<ssh xmlns="uri:oozie:ssh-action:0.1">
<host>${CMNodeLogin}</host>
<command>${hourscript}</command>
<capture-output/>
</ssh>
<ok to="joinnode"/>
<error to="killAction"/>
</action>
<action name="approach3">
<ssh xmlns="uri:oozie:ssh-action:0.1">
<host>${CMNodeLogin}</host>
<command>${approach3script}</command>
<capture-output/>
</ssh>
<ok to="joinnode"/>
<error to="killAction"/>
</action>
<action name="aproach11">
<ssh xmlns="uri:oozie:ssh-action:0.1">
<host>${CMNodeLogin}</host>
<command>${approach11script}</command>
<capture-output/>
</ssh>
<ok to="joinnode"/>
<error to="killAction"/>
</action>
<action name="aproach12">
<ssh xmlns="uri:oozie:ssh-action:0.1">
<host>${CMNodeLogin}</host>
<command>${approach12script}</command>
<capture-output/>
</ssh>
<ok to="joinnode"/>
<error to="killAction"/>
</action>
<action name="aproach13">
<ssh xmlns="uri:oozie:ssh-action:0.1">
<host>${CMNodeLogin}</host>
<command>${approach13script}</command>
<capture-output/>
</ssh>
<ok to="joinnode"/>
<error to="killAction"/>
</action>
<action name="aproach14">
<ssh xmlns="uri:oozie:ssh-action:0.1">
<host>${CMNodeLogin}</host>
<command>${approach14script}</command>
<capture-output/>
</ssh>
<ok to="joinnode"/>
<error to="killAction"/>
</action>
<action name="aproach15">
<ssh xmlns="uri:oozie:ssh-action:0.1">
<host>${CMNodeLogin}</host>
<command>${approach15script}</command>
<capture-output/>
</ssh>
<ok to="joinnode"/>
<error to="killAction"/>
</action>
<action name="aproach16">
<ssh xmlns="uri:oozie:ssh-action:0.1">
<host>${CMNodeLogin}</host>
<command>${approach16script}</command>
<capture-output/>
</ssh>
<ok to="joinnode"/>
<error to="killAction"/>
</action>
<action name="aproach17">
<ssh xmlns="uri:oozie:ssh-action:0.1">
<host>${CMNodeLogin}</host>
<command>${approach17script}</command>
<capture-output/>
</ssh>
<ok to="joinnode"/>
<error to="killAction"/>
</action>
<join name="joinnode" to="end"/>
<kill name="killAction">
<message>"Killed job due to error"</message>
</kill>
<end name="end"/>
</workflow-app>

person Community    schedule 14.10.2014    source источник


Ответы (1)


Создайте новый узел (в основном java), который будет выполнять за вас действия по очистке. Также направьте все действия с ошибкой на этот новый узел. Вы сможете определить узел, который на самом деле вызвал ошибку, используя функцию EL - ${wf:lastErrorNode()}. Передайте это как аргумент узлу обработки очистки, чтобы внутри java вы могли выполнять любую логику, которую хотите иметь для очистки (используйте API java hdfs).

Новый узел будет выглядеть так:

<action name="myCleanUpAction">
<java>
        <job-tracker>${jobTracker}</job-tracker>
        <name-node>${nameNode}</name-node>
        <main-class>com.foo.CleanUpMain</main-class>
        <arg>${wf:lastErrorNode()}</arg>
        <arg>any useful argument1</arg>
        <arg>any useful argument2</arg>
    </java>
    <ok to="fail"/>
    <error to="fail"/>
</action>
person NelsonPaul    schedule 20.10.2014