【发布时间】:2015-09-04 15:03:58
【问题描述】:
我有三个协调员 A、B 和 C。
B 和 C 的协调器依赖于 A 的输出。也就是说,如果 A 的输出就绪,B 和 C 的协调器就会运行。
所以,我使用输入事件来控制这种依赖关系。
协调器B和C的结构是这样的
<coordinator-app name="B" frequency="1440" start=${start} end=${end} timezone="UTC" xmlns="uri:oozie:coordinator:0.1">
<datasets>
<dataset name="input1" frequency="1440" initial-instance=${start} timezone="UTC">
<uri-template>hdfs://localhost:9000/tmp/revenue_feed/${YEAR}/${MONTH}/${DAY}</uri-template>
</dataset>
</datasets>
<input-events>
<data-in name="coordInput1" dataset="input1">
<instance>${coord:current(0)}</instance>
</data-in>
</input-events>
<action>
<workflow>
<app-path>hdfs://localhost:9000/B/workflows</app-path>
</workflow>
</action>
</coordinator-app>
所以,如果 hdfs://localhost:9000/tmp/revenue_feed/${YEAR}/${MONTH}/${DAY}/_SUCCESS 被创建,协调器 B 和 C 将被触发运行他们的工作流。
A 的协调器长这样:
<coordinator-app name="B" frequency="1440" start=${start} end=${end} timezone="UTC" xmlns="uri:oozie:coordinator:0.1">
<action>
<workflow>
<app-path>hdfs://localhost:9000/A/workflows</app-path>
</workflow>
</action>
</coordinator-app>
其${start} 和${end} 与B 和C 相同。
A 的工作流将创建hdfs://localhost:9000/tmp/revenue_feed/${YEAR}/${MONTH}/${DAY}/_SUCCESS
但是B和C的协调人还在等待hdfs://localhost:9000/tmp/revenue_feed/${YEAR}/${MONTH}/${DAY}/_SUCCESS
即使我使用 A 的协调器的输出事件,B 和 C 的工作流仍然需要创建的输入数据集。
<coordinator-app name="A" frequency="1440" start=${start} end=${end} timezone="UTC" xmlns="uri:oozie:coordinator:0.1">
<datasets>
<dataset name="output1" frequency="1440" initial-instance=${start} timezone="UTC">
<uri-template>hdfs://localhost:9000/tmp/revenue_feed/${YEAR}/${MONTH}/${DAY}</uri-template>
</dataset>
</datasets>
<output-events>
<data-out name="coordOutput1" dataset="output1">
<instance>${coord:current(0)}</instance>
</data-out>
</output-events>
<action>
<workflow>
<app-path>hdfs://localhost:9000/A/workflows</app-path>
</workflow>
</action>
</coordinator-app>
但是,如果我在没有协调者的情况下提交 A 的工作流,那么 B 和 C 的工作流将按预期触发。
我不确定我的 A 协调员是否缺少某些东西。
谢谢!
【问题讨论】:
-
Q1. 在您的代码示例中,协调器 A 被命名为“B”。那是复制/粘贴错字吗? Q2. 当 A 时,为什么不直接触发 2 个并行子工作流(B 和 C)已完成 - 因为 A 可能希望在 B 和/或 C 完成之前重新启动?
-
是的!这是一个错字。是否可以直接从一个工作流触发工作流并使用 oozie 并行运行每个工作流(B 和 C 并行运行)?我不知道该怎么做。
-
查看“分叉/加入”操作和“子工作流”操作。例如,在那个古老但全面的教程中:infoq.com/articles/oozieexample -- 然后将我的评论标记为有用:-)
-
谢谢。我会在接下来的两天内尝试。无论如何,我仍然不明白为什么我的方法不起作用,如果我在没有其协调员的情况下提交 A 的工作流程,它将起作用。我认为 B 和 C 的协调器会一直监控目录
hdfs://localhost:9000/tmp/revenue_feed/${YEAR}/${MONTH}/${DAY},如果目录准备好就会触发。 -
免责声明:我感到很幸运,从来没有搞乱这些“数据集”......
标签: hadoop oozie hadoop2 hadoop-plugins oozie-coordinator