2015-07-20 26 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

你能否詳細些嗎?我閱讀了您鏈接的頁面,但在我看來,沒有任何內容允許您暫停工作流程 - 我瞭解如何讓工作流程根據文件是否存在執行一個或另一個操作,但我不知道請參閱如何使工作流程等待生成文件。 –