开始时未对齐的Oozie行为

时间:2015-08-05 12:58:40

标签: hadoop oozie oozie-coordinator

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

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

2 个答案:

答案 0 :(得分: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>

cf. Oozie 4.x reference

如果协调器暂停然后恢复,或者如果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版本。)

Oozie 4.1 doc

我测试了这个,它确实适用于CRON频率。它优于您的LAST_ONLY执行,因为除了当前/未来的迭代之外,LAST_ONLY仍将运行过去的最新迭代(具有未对齐的时间)。

<execution>NONE</execution>