2017-02-03 11 views
0

У меня есть один координатор oozie и рабочие задания, Когда мое одно из действий рабочего процесса завершено, мне нужно начать следующее действие через некоторое время, скажем, 50 минут. Могу ли я настроить это из рабочего процесса oozie или координатора oozie, чтобы подождать некоторое время для выполнения следующего действия (в зависимости от предыдущего действия и некоторой асинхронной задачи, начатой ​​предыдущим).как отложить действие рабочего процесса с координатором oozie

координатор XML

<coordinator-app name="ods-ds-cms-coordinator" start="${startTime}" end="${endTime}" 
       frequency="${coord:days(1)}" timezone="${timeZone}" xmlns="uri:oozie:coordinator:0.5"> 
    <action> 
     <workflow> 
      <app-path>${exampleDir}/ods-ds-cms-workflow.workflow</app-path> 
      <configuration> 
       <property> 
        <name>nameNode</name> 
        <value>${nameNode}</value> 
       </property> 
       <property> 
        <name>jobTracker</name> 
        <value>${jobTracker}</value> 
       </property> 
       <property> 
        <name>exampleDir</name> 
        <value>${nameNode}/custom/oozie</value> 
       </property> 
      </configuration> 
     </workflow> 
    </action> 
</coordinator-app> 

workflow.xml

<?xml version="1.0" encoding="UTF-8"?> 

<workflow-app xmlns="uri:oozie:workflow:0.5" name="ods-ds-cms-workflow.workflow"> 
    <global> 
    <job-tracker>${jobTracker}</job-tracker> 
    <name-node>${nameNode}</name-node> 
    <configuration> 
     <property> 
     <name>mapred.job.queue.name</name> 
     <value>${queue}</value> 
     </property> 
    </configuration> 
    </global> 
    <start to="cms-checker"/> 
    <action name="cms-checker"> 
    <java> 
     <main-class>com.insense.helper.CMSPullChecker</main-class> 
     <arg>${cmsChecker}</arg> 
     <arg>${cmsType}</arg> 
     <capture-output/> 
    </java> 
    <ok to="trigger_next_job"/> 
    <error to="kill"/> 
    </action> 
    <action name="trigger_next_job"> // need to start this after some time 
    <sub-workflow> 
     <app-path>${exampleDir}/ods-ds-bank.workflow</app-path> 
     <propagate-configuration/> 
    </sub-workflow> 
    <ok to="end"/> 
    <error to="kill"/> 
    </action> 

Как я архивировать, что с oozie framwork, я могу это сделать с помощью Java действие с Thread.sleep (50 * 60 * 1000) , лучший способ сделать с oozie?

ответ

1

Вы можете создать другой рабочий процесс только с одним заданием - Shell. Затем вы должны создать скрипт с помощью одной команды:

sleep 50m 

Когда один рабочий процесс будет завершен, вы должны выполнить этот рабочий процесс с sleep команды. Следующий рабочий процесс начнется через 50 минут.

Пример.

workflow.xml

<workflow-app name="My_Workflow" xmlns="uri:oozie:workflow:0.5"> 
<start to="shell-3322"/> 
<kill name="Kill"> 
    <message>Action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message> 
</kill> 
<action name="shell-3322"> 
    <shell xmlns="uri:oozie:shell-action:0.1"> 
     <job-tracker>${jobTracker}</job-tracker> 
     <name-node>${nameNode}</name-node> 
     <exec>sleep.sh</exec> 
     <file>sleep.sh#sleep.sh</file> 
      <capture-output/> 
    </shell> 
    <ok to="End"/> 
    <error to="Kill"/> 
</action> 
<end name="End"/> 

sleep.sh

sleep 50m 
+0

в этом случае мне нужно, чтобы УПП/скопировать скрипт для каждого узла, как oozie работа может выполняться на любой доступный узел или просто поместить его в oozie.libpath будет хорошо? Есть ли другой способ? настройки некоторых конфигураций в координаторе? Спасибо за ваш ответ . –

+0

Вам не нужно копировать сценарий оболочки на каждый узел. Вам нужно скопировать его в HDFS (вы можете использовать команду copyFromLocal) и сообщить Oozie, где находится скрипт. Я не думаю, что есть другой способ сделать это с помощью Оози. Оози - простое обслуживание. Возможно, вам стоит проверить Apache NiFi или StreamSets. –

+0

@MateuszGrabowski ответ в порядке, но будет здорово, если скрипт получит сумму и единицы извне скрипта = делает его более общим и может быть повторно использован – Mzf