0

我注意到,如果我在当前时间之前以许多“迭代”(就频率而言)的开始时间启动 Oozie 协调器,那么协调器将按顺序运行工作流几次,而忽略分配的频率。但是,对我来说,工作流/操作以指定的频率自行运行比工作流/操作在给定点运行正确的次数更为重要。

有什么办法可以避免这种行为?一种方法显然是确保开始时间在迭代时间内是正确的(有没有办法让它自动占用开始时间?)。另一种方法是对其进行配置以完全避免这种行为,并且基本上在下一次应该给出开始时间和频率的时候运行。

4

2 回答 2

0

避免“过去”开始日期产生副作用的明显方法是……将提交时的实际开始日期设置为“现在”。

这就是我们在我的团队中这样做的方式:

  • 在本地文件系统上,写下带有占位符的“Coord-template.xml”,例如start="%Now%"
  • 在提交之前,生成实际的“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 4.x 参考

这些规则也适用于协调器暂停然后恢复的情况,或者 Oozie 服务停止然后重新启动的情况,或者 YARN 必须将新作业排队很长时间(因为集群 100% 忙)。

于 2015-08-05T20:41:58.703 回答
0

Oozie 最近有所改进,因此有一个比当前接受的答案更简单的解决方案。从 Oozie 4.1 开始,有一个“NONE”执行可用。这或多或少地跳过了过去发生的迭代。这是文档片段:

NONE:与 LAST_ONLY 类似,除了跳过所有较旧的实现。当设置为 NONE 时,当当前时间超过操作的标称时间的特定配置分钟数(容差)时,将跳过正在等待或准备好的操作。默认情况下,阈值为 1 分钟。例如,假设动作 1 和 2 都是 WAITING ,当前时间是下午 5:20,两个动作的标称时间都在下午 5:19 之前。假设在此之前它们没有转换到 SUBMITTED(或终止状态),这两个操作都将变为 SKIPPED。另一种思考方式是将其视为类似于将超时设置为 1 分钟,这是最小的时间单位,除了 SKIPPED 状态不会导致协调器作业最终变为 DONEWITHERROR 并且实际上可以变为 SUCCEEDED(即它是 ”

Oozie 4.1 文档

我已经对此进行了测试,它确实适用于 CRON 频率。在您的情况下,它优于 LAST_ONLY 执行,因为除了当前/未来的迭代之外,LAST_ONLY 仍将运行过去的最新迭代(时间未对齐)。

<execution>NONE</execution>
于 2016-08-10T23:13:28.337 回答