0

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

${coord:latest(0)}

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

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

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

谢谢阅读

4

1 回答 1

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}" ...>

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

于 2014-02-21T02:55:32.643 回答