【问题标题】:oozie coordinator input-event does not workoozie 协调器输入事件不起作用
【发布时间】: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 个并行子工作流(BC)已完成 - 因为 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


【解决方案1】:

原因是你没有指定done-flag,所以oozie使用默认:_success

done-flag:数据集的完成文件。如果完成标志不是 指定,然后 Oozie 配置 Hadoop 在 输出目录。如果完成标志设置为空,则 协调器查找目录本身是否存在。

你应该添加一个空的

<done-flag></done-flag>

到数据集。

【讨论】:

  • 其实A的工作流在其输出目录下创建了_success文件但其他依赖的工作流并没有运行。
  • 哦,我明白了,你也提到了它......真的很奇怪。让我复制你的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-30
  • 1970-01-01
相关资源
最近更新 更多