【问题标题】:Can Oozie pause a workflow until a certain file is generated/exists?Oozie 可以暂停工作流直到某个文件生成/存在吗?
【发布时间】:2015-07-20 21:43:37
【问题描述】:

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

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

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

【问题讨论】:

    标签: java hadoop mapreduce hive oozie


    【解决方案1】:

    创建一个协调器,它将在给定的持续时间内在指定的 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>
    

    【讨论】:

    • 我必须在数据集元素内添加&lt;done-flag&gt;&lt;/done-flag&gt;。它正在寻找不存在的_Succes 文件。
    【解决方案2】:

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

    检查文件,一个 switch 案例,以确定你让文件执行你的下一个 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 案例中添加您的操作节点并相应地继续。

    【讨论】:

    • 你能详细说明一下吗?我阅读了您链接到的页面,但在我看来,那里没有任何内容可以让您暂停工作流程 - 我了解如何根据文件是否存在告诉工作流程执行一项或多项操作,但我不知道看看如何让工作流等待文件生成。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-06
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多