开始未对齐的 Oozie 行为

Oozie Behavior with misaligned start

我注意到,如果我启动一个 Oozie 协调器,其开始时间比当前时间早 "iterations"(就频率而言),那么协调器将按顺序 运行 工作流程多次, 忽略分配的频率。但是,对我而言,workflow/action 运行 本身在指定频率下比 workflow/action 在给定频率下具有 运行 正确次数更重要点.

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

避免 "past" 开始日期的副作用的明显方法是...将提交时的实际开始日期设置为 "now"。

我的团队就是这样做的:

  • 在本地文件系统上,写下 "Coord-template.xml" 占位符,例如 start="%Now%"
  • 在提交之前,用

    生成实际的"Coordinator.xml"

    sed "s/%Now%/$(date --utc '+%FT%TZ')/" 坐标-template.xml > coordinator.xml

  • 将协调器定义上传到 HDFS,然后通过 Oozie CLI 提交

~~~~~~~~~~~~

备选方案:如果您使用 "basic" 频率 (不是类似 CRON 的调度),您可能想尝试这些 让 Oozie 为所有人创建执行"past" 个时隙但立即丢弃它们:

  <throttle>1</throttle>

and/or

  <execution>LAST_ONLY</execution>

cf. Oozie 4.x reference

如果协调器暂停然后恢复,或者 Oozie 服务停止然后重新启动,或者 YARN 必须将新作业排队很长时间(因为集群是 100 % 忙)。

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

NONE: Similar to LAST_ONLY except all older materializations are skipped. When NONE is set, an action that is WAITING or READY will be SKIPPED when the current time is more than a certain configured number of minutes (tolerance) past the action's nominal time. By default, the threshold is 1 minute. For example, suppose action 1 and 2 are both WAITING , the current time is 5:20pm, and both actions' nominal times are before 5:19pm. Both actions will become SKIPPED, assuming they don't transition to SUBMITTED (or a terminal state) before then. Another way of thinking about this is to view it as similar to setting the timeout equal to 1 minute which is the smallest time unit, except that the SKIPPED status doesn't cause the coordinator job to eventually become DONEWITHERROR and can actually become SUCCEEDED (i.e. it's a "good" version of TIMEDOUT ).

Oozie 4.1 doc

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

<execution>NONE</execution>