【问题标题】:how to delay workflow action with oozie coordinator如何使用 oozie 协调器延迟工作流操作
【发布时间】:2017-02-03 10:09:14
【问题描述】:

我有一个 oozie 协调员和工作流工作, 当我的一个工作流动作完成时,我需要在一段时间后开始下一个动作,比如说 50 分钟。 我可以从 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>

工作流.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 框架进行归档,我可以使用 java 操作和 Thread.sleep(50*60*1000) 来做到这一点,这是使用 oozie 的更好方法吗?

【问题讨论】:

    标签: java hadoop oozie job-scheduling oozie-coordinator


    【解决方案1】:

    您可以只用一个作业创建另一个工作流程 - Shell 作业。然后你应该用一个命令创建 shell 脚本:

    sleep 50m
    

    当一个工作流程完成时,您应该使用sleep 命令执行此工作流程。下一个工作流程将在 50 分钟后开始。

    示例。

    工作流.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
    

    【讨论】:

    • 在这种情况下,我是否需要将 shell 脚本 scp/复制到每个节点,因为 oozie 作业可以在任何可用节点上运行,或者只是将其放置到 oozie.libpath 就可以了吗?还有其他方法吗?在协调器中设置一些配置?谢谢你的回答。
    • 您不需要将shell脚本复制到每个节点。您需要将其复制到 HDFS(您可以使用 copyFromLocal 命令)并告诉 Oozie 脚本所在的位置。我认为使用 Oozie 没有其他方法可以做到这一点。 Oozie 是一项简单的服务。也许你应该检查一下 Apache NiFi 或 StreamSets。
    • @MateuszGrabowski 答案还可以,但如果脚本从脚本之外获取数量和单位,那就太好了 = 使其更通用并且可以重复使用
    猜你喜欢
    • 1970-01-01
    • 2019-09-27
    • 1970-01-01
    • 1970-01-01
    • 2013-05-30
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多