2015-07-10 105 views
0

Oozie有一套丰富的指令来描述任务之间所需的控制流。它有什么有助于在这些任务之间传递数据吗?或者是将数据完全留给用户?如何在oozie工作流任务之间传递数据

更新:我使用shell操作来调用spark,所以我需要一个足够一般的解决方案来包含该用例。

+1

你能解释你正在谈论什么类型的数据吗?你是指变量还是实际数据(例如MR作业的输出)? –

+0

@ brandon.bell实际数据。 – Marcin

回答

1

为了在Oozie Workflow Tasks之间传递数据,您需要将工作流2的输入定义为工作流1的输出。例如:

<workflow-app xmlns='uri:oozie:workflow:0.1' name='demo-wf'> 
    <start to="workflow1" /> 
    <action name="workflow1"> 
     <map-reduce> 
     <job-tracker>${jobTracker}</job-tracker> 
     <name-node>${nameNode}</name-node> 
     <configuration> 
      <property> 
      <name>mapred.input.dir</name> 
      <value>${workflow1_Input}</value> 
      </property> 
      <property> 
      <name>mapred.output.dir</name> 
      <value>${workflow1_Output}</value> 
      </property> 
     </configuration> 
     </map-reduce> 
     <ok to="workflow2" /> 
     <error to="fail" /> 
    </action> 
    <action name="workflow2"> 
     <map-reduce> 
     <job-tracker>${jobTracker}</job-tracker> 
     <name-node>${nameNode}</name-node> 
     <configuration> 
      <property> 
      <name>mapred.input.dir</name> 
      <value>${workflow1_Output}</value> 
      </property> 
      <property> 
      <name>mapred.output.dir</name> 
      <value>${workflow2_Output}</value> 
      </property> 
     </configuration> 
     </map-reduce> 
     <ok to="done" /> 
     <error to="fail" /> 
    </action> 
</workflow-app> 

注意,给我留下了一堆细节出于对地图,减少工作,只显示输入和输出。当你设置你的属性文件时,你可以定义输入和输出参数。还有一点需要注意的是MapReduce会忽略任何以下划线_作为输入。因此,当第一个MapReduce作业完成时,它将有一个_SUCCESS文件和一个_log目录,这将被忽略作为第二个动作的输入。

+0

谢谢。我认为这是mapreduce特定的?我使用shell动作来调用spark作业(我意识到我的问题没有提到)。 – Marcin

+0

您可以使用' [VAR1 = VALUE1]'将参数传递给Oozie Shell操作。我对Spark不是很熟悉,但是您应该能够在spark-submit期间通过参数传递输出路径,并将此输出路径用作未来操作的输入路径。 –