2015-07-20 27 views
0

我第一次使用Oozie,发现它有点难以解析规范。我试图创造条件,使我在Hive运行一些查询一个简单的工作流程,然后才能做一些分析,用不同的程序来执行shell动作,最后我想通过Oozie执行Java工作。Can Oozie可以暂停工作流程,直到某个文件生成/存在?

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

输入文件会很简单 - 最有可能的是我只有第二个动作shell,在退出前执行一些命令,如touch $(date -u "+%Y-%m-%d-%H").done,这样我的输入文件就是一个零字节文件像2015-07-20-14.done这样的名字。

回答

2

创建cordinator将寻找数据集在指定位置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> 
+0

我不得不在数据集元素中添加''。过分地,它正在寻找不存在的'_Succes'文件。 –

0

您可以在这里使用decision node概念。

检查的文件,一个开关的情况下尽快确定u有文件的执行你的下一个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"/> 

喜欢聪明人,你可以添加你的行动交换机箱中的节点并相应地继续。

+0

你能否详细些吗?我阅读了您链接的页面,但在我看来,没有任何内容允许您暂停工作流程 - 我了解如何让工作流程根据文件是否存在执行一个或另一个操作,但我不知道请参阅如何使工作流程等待生成文件。 –