Oozie 能否在某个文件 generated/exists 之前暂停工作流?

Can Oozie pause a workflow until a certain file is generated/exists?

我是第一次使用 Oozie,发现解析规范有点困难。我正在尝试创建一个简单的工作流程,其中我 运行 在 Hive 中进行一些查询,然后执行 shell 操作以便使用不同的程序进行一些分析,最后我想通过 Oozie.

执行 Java 作业

虽然我了解如何单独执行所有这些操作,但如何设置我的工作流程以便最终的 Java 作业在开始之前等待生成文件?谷歌搜索,我看到了使 Oozie 工作流在开始之前等待生成数据集的方法,但我不希望整个工作流等待,因为我只希望工作流中的一个特定操作等待用于生成输入文件。

输入文件会很简单——很可能我只需要第二个动作,shell,在它退出之前执行一些命令,比如 touch $(date -u "+%Y-%m-%d-%H").done,这样我的输入file 将是一个零字节文件,名称类似于 2015-07-20-14.done.

您可以在此处使用 decision node 概念。

检查文件,一个 switch case 以确定一旦你有文件执行你的下一个 java 动作。

----编辑------

在下面找到一个例子,这并不能解决你的问题:

 <workflow-app xmlns="uri:oozie:workflow:0.4" name="shell-wf">
<start to="shell-node"/>
<action name="shell-node">
    <shell xmlns="uri:oozie:shell-action:0.2">
        <job-tracker>${jobTracker}</job-tracker>
        <name-node>${nameNode}</name-node>
        <configuration>
            <property>
                <name>mapred.job.queue.name</name>
                <value>${queueName}</value>
            </property>
        </configuration>
        <exec>echo</exec>
        <argument>my_output=Hello Oozie</argument>
        <capture-output/>
    </shell>
    <ok to="check-output"/>
    <error to="fail"/>
</action>
<decision name="check-output">
    <switch>
        <case to="end">
            ${wf:actionData('shell-node')['my_output'] eq 'Hello Oozie'}
        </case>
        <default to="fail-output"/>
    </switch>
</decision>
<kill name="fail">
    <message>Shell action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
</kill>
<kill name="fail-output">
    <message>Incorrect output, expected [Hello Oozie] but was [${wf:actionData('shell-node')['my_output']}]</message>
</kill>
<end name="end"/>

同样,您可以在 switch case 中添加动作节点并相应地继续。

创建一个协调器,它将在给定的持续时间内在指定的 hdfs 位置查找数据集。

样本协调员

<coordinator-app name="FILE_CHECK" frequency="1440" start="2009-02-01T00:00Z" end="2009-02-07T00:00Z" timezone="UTC" xmlns="uri:oozie:coordinator:0.1">
   <datasets>
      <dataset name="datafile" frequency="60" initial-instance="2009-01-01T00:00Z" timezone="UTC">
         <uri-template>hdfs://<URI>:<PORT>/data/feed/${YEAR}/${MONTH}/${DAY}/${HOUR}</uri-template>
      </dataset>
   </datasets>
   <input-events>
      <data-in name="coorddatafile" dataset="datafile">
          <start-instance>${coord:current(-23)}</start-instance>
          <end-instance>${coord:current(0)}</end-instance>
      </data-in>
   </input-events>
   <action>
      <workflow>
         <app-path>hdfs://<URI>:<PORT>/workflows</app-path>
      </workflow>
   </action>     
</coordinator-app>