我注意到,如果我在当前时间之前以许多“迭代”(就频率而言)的开始时间启动 Oozie 协调器,那么协调器将按顺序运行工作流几次,而忽略分配的频率。但是,对我来说,工作流/操作以指定的频率自行运行比工作流/操作在给定点运行正确的次数更为重要。
有什么办法可以避免这种行为?一种方法显然是确保开始时间在迭代时间内是正确的(有没有办法让它自动占用开始时间?)。另一种方法是对其进行配置以完全避免这种行为,并且基本上在下一次应该给出开始时间和频率的时候运行。
我注意到,如果我在当前时间之前以许多“迭代”(就频率而言)的开始时间启动 Oozie 协调器,那么协调器将按顺序运行工作流几次,而忽略分配的频率。但是,对我来说,工作流/操作以指定的频率自行运行比工作流/操作在给定点运行正确的次数更为重要。
有什么办法可以避免这种行为?一种方法显然是确保开始时间在迭代时间内是正确的(有没有办法让它自动占用开始时间?)。另一种方法是对其进行配置以完全避免这种行为,并且基本上在下一次应该给出开始时间和频率的时候运行。
避免“过去”开始日期产生副作用的明显方法是……将提交时的实际开始日期设置为“现在”。
这就是我们在我的团队中这样做的方式:
在提交之前,生成实际的“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% 忙)。
Oozie 最近有所改进,因此有一个比当前接受的答案更简单的解决方案。从 Oozie 4.1 开始,有一个“NONE”执行可用。这或多或少地跳过了过去发生的迭代。这是文档片段:
NONE:与 LAST_ONLY 类似,除了跳过所有较旧的实现。当设置为 NONE 时,当当前时间超过操作的标称时间的特定配置分钟数(容差)时,将跳过正在等待或准备好的操作。默认情况下,阈值为 1 分钟。例如,假设动作 1 和 2 都是 WAITING ,当前时间是下午 5:20,两个动作的标称时间都在下午 5:19 之前。假设在此之前它们没有转换到 SUBMITTED(或终止状态),这两个操作都将变为 SKIPPED。另一种思考方式是将其视为类似于将超时设置为 1 分钟,这是最小的时间单位,除了 SKIPPED 状态不会导致协调器作业最终变为 DONEWITHERROR 并且实际上可以变为 SUCCEEDED(即它是 ”
我已经对此进行了测试,它确实适用于 CRON 频率。在您的情况下,它优于 LAST_ONLY 执行,因为除了当前/未来的迭代之外,LAST_ONLY 仍将运行过去的最新迭代(时间未对齐)。
<execution>NONE</execution>