Как я могу передать значение в действии рабочего процесса oozie из другого действия, которое является сценарием оболочки - PullRequest
0 голосов
/ 11 марта 2019

У меня есть один рабочий процесс, как указано в коде. И у меня есть два вопроса к одному и тому же.

Первый Мне нужно получить значение, рассчитанное по сценарию оболочки из действия - «shellscript», и это вычисленное значение, которое мне нужно передать в другое действие рабочего процесса - counter_decision. то есть значение переменной - variable_from_shellscript в действии counter_decision, должно быть получено из действия оболочки.

Второй Я вызываю action1 неоднократно на основе counter_decision. Мне нужно каждый раз, когда я звоню, это должно быть как action1, action2, action3 .... и так далее. Как я могу это сделать.

    <action name="shellscript">
        <shell xmlns="uri:oozie:shell-action:0.1">
            <job-tracker>${jobTracker}</job-tracker>
            <name-node>${nameNode}</name-node>
            <exec>${myscript}</exec>
            <file>${myscriptPath}${myscript}#${myscript}</file>
            <capture-output />
        </shell>
        <ok to="counter_decision" />
        <error to="KillEmail" />
    </action>



    <decision name="counter_decision">
        <switch>
            <case to="action1">
              ${counter le variable_from_shellscript}
            </case>
            <case to="dummy">
              ${counter gt variable_from_shellscript}
            </case>
            <default to="end"/>
        </switch>
    </decision>


    <action name="action1" cred="hcat,hive2">
        <spark xmlns="uri:oozie:spark-action:0.1">
            <job-tracker>${jobTracker}</job-tracker>
            <name-node>${nameNode}</name-node>
            <master>yarn-cluster</master>
            <mode>cluster</mode>
            <name>${appName}</name>
            <property>
                <name>counter</name>
                <value>${counter + 1}</value>
            </property>         
            <class>${main_class}</class>
            <jar>${projectCore}</jar>
            <arg>${projectConfigFile}</arg>
            <arg>0</arg>
            <arg>main</arg>
        </spark>
        <ok to="action2" />
        <error to="KillEmail" />
    </action>

1 Ответ

0 голосов
/ 21 марта 2019

Насколько я знаю, мы не можем определить имя действия динамически. Даже если у вас есть несколько случаев, основанных на подсчете, в конечном итоге вы вызываете один и тот же искровой код. Почему вы не можете передать значение счетчика непосредственно в искровое действие и включить в него свою логику переключения?

Если вам подходит, вы можете использовать ниже модифицированный код.

<action name="shellscript">
<shell xmlns="uri:oozie:shell-action:0.1">
    <job-tracker>${jobTracker}</job-tracker>
    <name-node>${nameNode}</name-node>
    <exec>${myscript}</exec>
    <file>${myscriptPath}${myscript}#${myscript}</file>
    <capture-output />
</shell>
<ok to="decision_maker" />
<error to="KillEmail" />
</action>

<action name="decision_maker" cred="hcat,hive2">
<spark xmlns="uri:oozie:spark-action:0.1">
    <job-tracker>${jobTracker}</job-tracker>
    <name-node>${nameNode}</name-node>
    <master>yarn-cluster</master>
    <mode>cluster</mode>
    <name>${appName}</name>
    <property>
        <name>counter</name>
        <value>${counter + 1}</value>
    </property>         
    <class>${main_class}</class>
    <jar>${projectCore}</jar>
    <arg>${wf:actionData('shellscript')['counter']}</arg>
</spark>
<ok to="action2" />
<error to="KillEmail" />
</action>

Также убедитесь, что скрипт возвращает выходные данные в форме пар ключ-значение, как показано ниже.

Счетчик = 10

...