2015-09-04 39 views
0

我有三个协调员A,B和COozie的协调输入事件不起作用

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中缺少某些东西。

谢谢!

+0

** Q1。**在您的代码示例中,协调员A被命名为“B”。这是一个复制/粘贴错字? ** Q2。**当* A *完成时,您为什么不并行触发2个子工作流程(* B *和* C *)?因为* A *可能希望在* B *之前重新启动和/或* C *完成了吗? –

+0

是的!这是一个错字。是否可以直接从一个工作流触发工作流,并使用oozie并行运行每个工作流(B和C是并行运行的)?我不知道该怎么做。 –

+0

查看“叉/加入”操作和“子工作流”操作。例如,在那个老的,但全面的教程:http://www.infoq.com/articles/oozieexample * - 然后标记我的评论是有用的,如果它是: - )*) –

回答

0

的原因是你没有指定的完成标志,所以Oozie的使用默认:_success

完成标志:为数据集的完成文件。如果done-flag不是指定的 ,那么Oozie将Hadoop配置为在 的输出目录中创建_SUCCESS文件。如果完成标志设置为空,则协调器会查找目录本身的存在。

您应该添加一个空

<done-flag></done-flag> 

到数据集。

+0

实际上,A的工作流程在其输出目录中创建了_success文件,但其他相关工作流程未运行。 –

+0

哦,我看到了,你也为它着想......真的很奇怪。让我复制你的问题。 – kecso