我有一个Oozie协调器,它在启动时将其开始时间设置为365天前,然后以每日频率运行其工作流,直到到达具有输入数据的最新日期。 所以协调器.xml看起来像这样:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<coordinator-app name="${jobName}" frequency="${coord:days(1)}" start="${startTime}" end="${endTime}" timezone="${timezone}" xmlns="uri:oozie:coordinator:0.2">
<controls>
<timeout>-1</timeout>
<concurrency>30</concurrency>
<execution>FIFO</execution>
</controls>
<datasets>
<dataset name="myData" frequency="${coord:days(1)}" initial-instance="${initialTime}" timezone="${timezone}">
<uri-template>${outputPath}/${YEAR}${MONTH}${DAY}</uri-template>
</dataset>
</datasets>
<input-events>
<data-in name="myInput" dataset="myData">
<instance>${coord:current(-1)}</instance>
</data-in>
</input-events>
<action>
<workflow>
<app-path>${appPath}</app-path>
<configuration>
<property>
<name>myInput</name>
<value>${coord:dataIn('myInput')}</value>
</property>
<property>
<name>date</name>
<value>${coord:formatTime(coord:dateOffset(coord:nominalTime(), -1, 'DAY'), 'yyyyMMdd')}</value>
</property>
</configuration>
</workflow>
</action>
</coordinator-app>
启动时,此协调器会触发 365 个工作流。 然后第二天,它只对当天的输入数据运行一个工作流。以此类推第二天。
现在要求发生了变化,我需要每天运行 365 个工作流,而不仅仅是第一次! 所以在启动时,我希望它像现在一样运行。 但是第二天,当输入数据可用时,我需要返回并再次运行过去 365 天的日常工作流。 以此类推,一旦检测到新的输入数据,就会立即进行后续工作。
我怎样才能做到这一点?谢谢
阿尔瓦罗
在协调器的data-in
标记中,使用 start-instance
和 end-instance
指定要视为输入的实例范围。
启动实例:指实例范围的开始时间(同步数据集的时间)。结束实例:指实例范围的结束时间(同步数据集的时间)。
<input-events>
<data-in name="myInput" dataset="myData">
<start-instance>${coord:current(-365)}</start-instance>
<end-instance>${coord:current(-1)}</end-instance>
</data-in>
</input-events>
有关更多信息,请参阅: 同步协调器应用程序定义
您可以使用子工作流以递归方式调用主工作流。