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>
我是第一次使用 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>