我在oozie上有一个协调员,负责执行一系列任务,每个任务都取决于最后一个的输出。 每个任务都输出一个过时的文件夹,并使用
查找其前任的输出${coord:latest(0)}
当没有其他任何东西在运行时,这一切都在我的开发群集上正常工作;每5分钟oozie会排队另一份工作,并且在那5分钟内上一份工作已经运行,所以当新工作设置好后,它会看到它所需的目录。
我在生产集群上遇到问题;作业被提交,但是被放入队列并且不运行一段时间,但仍然每5分钟oozie排队另一个,并且在其初始化阶段,它被分配了它的'previous'文件夹,因为它的前身没有运行,所以“最新”功能给它提供了与前一个工作相同的输入。然后,我最终得到10个工作,所有工作都采取相同的输入......
我需要的是一种严格防止协调器序列中的下一个作业被创建直到其前任完成运行的方法。 有没有办法可以做到这一点?
感谢您阅读
答案 0 :(得分: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>
输入事件中的“coord:current(-1)”表示先前的输出。它会将数据集URI teamplate解释为“昨天”,Oozie将通过检查成功标志来检查数据是否存在于HDFS中,成功标志默认为输出目录下的名为“_SUCCESS”的空文件。在启动当前工作流程之前,Oozie将继续等待此标志。
不过,你也可以设置<coordinator-app name="my_coordinator" frequency="${coord:days(1)}" start="${start_time}" end="${end_time}" ...>
定义协调员作业的开始时间和结束时间,以便您可以捕获积压数据。