我注意到如果我启动一个Oozie协调器,其启动时间在当前时间之前有许多“迭代”(就频率而言),那么协调器将按顺序运行工作流几次,忽略指定的频率。但是,对我来说,更重要的是工作流/动作以指定的频率运行,而不是工作流/动作在给定点运行正确的次数。
有什么方法可以避免这种行为吗?一种方法显然是确保在迭代时间内开始时间是正确的(有没有办法让它自动占用开始时间?)。另一种方法是将其配置为完全避免这种行为,并且基本上在下一次应该给出开始时间和频率时运行。
答案 0 :(得分:0)
避免过去"的副作用的明显方法开始日期是...在提交时将实际开始日期设置为"现在"。
这就是我们在团队中的表现方式:
在提交之前,生成实际的" Coordinator.xml"与
sed" s /%Now%/ $(date --utc' +%FT%TZ')/" coord-template.xml> coordinator.xml
将协调员定义上传到HDFS,然后通过Oozie CLI提交
~~~~~~~~~~~~
替代方案:如果您正在使用"基本"频率(不是CRON式调度)你可能想尝试这些< controls>让Oozie为所有"过去"创建执行时间段,但立即丢弃它们:
<throttle>1</throttle>
和/或
<execution>LAST_ONLY</execution>
如果协调器暂停然后恢复,或者如果Oozie服务停止然后重新启动,或者如果YARN必须将新作业排队很长时间(因为群集100%忙碌),规则也适用)。
答案 1 :(得分:0)
Oozie最近有所改进,所以有一个比目前接受的答案更容易的解决方案。从Oozie 4.1开始,有一个&#34; NONE&#34;执行可用。这会或多或少地跳过过去发生的迭代。这是文档摘要:
NONE:与LAST_ONLY类似,但跳过所有旧的实现。当设置为NONE时,当当前时间超过动作的标称时间超过某个配置的分钟数(容差)时,等待或准备的动作将被跳过。默认情况下,阈值为1分钟。例如,假设操作1和2都是WAITING,当前时间是下午5:20,并且两个操作都是&#39;名义时间是在下午5:19之前。假设在此之前他们没有过渡到SUBMITTED(或终端状态),这两个动作都将成为SKIPPED。另一种思考方式是将其视为类似于将超时设置为等于1分钟(即最小时间单位),除了SKIPPED状态不会导致协调器作业最终变为DONEWITHERROR并且实际上可以变为成功(即它&#34;良好&#34; TIMEDOUT版本。)
我测试了这个,它确实适用于CRON频率。它优于您的LAST_ONLY执行,因为除了当前/未来的迭代之外,LAST_ONLY仍将运行过去的最新迭代(具有未对齐的时间)。
<execution>NONE</execution>