【问题标题】:Strict coordinator job ordering on OozieOozie 上的严格协调员工作排序
【发布时间】:2014-02-07 17:37:12
【问题描述】:

我在 oozie 上有一个协调器,它运行一系列任务,每个任务都取决于最后一个的输出。 每个任务输出一个过时的文件夹并使用

查找其前任的输出
${coord:latest(0)}

当没有其他东西运行时,这一切都在我的开发集群上运行良好;每 5 分钟 oozie 会排队另一个作业,并且在那 5 分钟内之前的作业已经运行,所以当新作业设置时它会看到它需要的目录。

我在生产集群上遇到了问题;作业被提交,但被放入队列中并且不会运行一段时间,但仍然每 5 分钟 oozie 会排队另一个作业,并且在其初始化阶段,它被分配了其“上一个”文件夹,该文件夹尚未尚未创建,因为其前身尚未运行,因此“最新”功能为其提供与前一个作业相同的输入。然后我最终得到了 10 个工作都采用相同的输入......

我需要的是一种严格防止协调器序列中的下一个作业在其前身完成运行之前创建的方法。 有没有办法做到这一点?

感谢阅读

【问题讨论】:

  • 您为合作指定的频率是多少?
  • 看看这些例子,github.com/yahoo/oozie/wiki/Oozie-Coord-Use-Cases 我不确定这是否是最好的主意,但您可以使用Coordinator Job With Timeouts 示例设置超时并消除堆积的相同作业跨度>
  • 抱歉,我在这里遗漏了一些关键信息 - 频率设置为每天,但我们有积压的旧数据要导入,因此它比名义运行更频繁地安排作业时间已经过去了。

标签: oozie oozie-coordinator


【解决方案1】:

这正是 Oozie 旨在解决的用例。 Oozie 会在启动前等待所有数据依赖。

请尝试理解 coordinator.xml 中的以下配置

    <datasets>
        <dataset name="my_data" frequency="${coord:days(1)}" initial-instance="2013-01-27T00:00Z">
            <uri-template>YOUR_DATA/${YEAR}${MONTH}${DAY}</uri-template>
        </dataset>
    ...
    <datasets>

    <input-events>
        <data-in name="my_data" dataset="my_data">
            <instance>${coord:current(-1)}</instance>
        </data-in>
    </input-events>

    <output-events>
        <data-out name="my_data" dataset="my_data">
           <instance>${coord:current(0)}</instance>
        </data-out>
    </output-events>

input-events 中的“coord:current(-1)”表示之前的输出。它将数据集 URI teamplate 解释为“昨天”,Oozie 将通过检查成功标志来检查数据是否存在于 HDFS 中,默认情况下,成功标志是一个名为“_SUCCESS”的空文件,位于输出目录下。 Oozie 将在启动当前工作流之前一直等待此标志。

顺便说一句,你也可以设置

<coordinator-app name="my_coordinator" frequency="${coord:days(1)}" start="${start_time}" end="${end_time}" ...>

定义协调器作业的开始时间和结束时间,以便您了解积压数据。

【讨论】:

  • 我们曾考虑使用 'coord:current(-1)' 但我们不能保证某一天的数据始终可用,在这种情况下我们希望退回到前一天的输出,因此我们使用了'coord:latest(0)'。在多个作业实现的情况下,这会在前一个作业完成之前进行评估,并选择错误的输入。不过,似乎不可能对具体化进行规范,因此我们将不得不重新配置我们的其余流程以与此方法兼容。
  • 我试图理解这个场景,但还是有点困惑。如果一个新工作依赖于以前的工作输出,那么它怎么能并行呢?如果您不需要赶上积压数据,您是否尝试将输出复制到另一个位置,并将该位置用作整个工作流程的唯一输入?我的意思是这个位置只存储最新的结果。
  • 每个作业都依赖于前一个作业的输出,但不能保证前一个作业在前一天成功运行,所以它需要'coord:latest(0)' 文件夹。我们可以让每个作业将其数据输出到一个公用文件夹,但我们仍然需要一种方法来确保将要运行的最新作业已经完成。
  • 那我觉得把coordinator的并发设置为1就够了吧?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多