如何使用EL表达式创建变量以在所有操作oozie工作流中使用?

时间:2017-02-13 16:11:03

标签: hadoop el oozie

我想创建一个应该可用于Oozie工作流程中所有操作的变量。我试图创建它,如下所示。但EL表达式没有得到评估,导致变量current_ts值为EL表达式本身。有人可以对此有所了解吗?

<workflow-app xmlns="uri:oozie:workflow:0.4" name="no-op-wf">
  <parameters>
    <property>
      <name>current_ts</name>
      <value>${replaceAll((replaceAll((replaceAll((timestamp()),"-","")),"T","_")),":","")}</value>
    </property>
  </parameters>
  <start to="test"/>
  <kill name="test">
    <!--message Just to show that this expression works if used here>Timestamp - [${replaceAll((replaceAll((replaceAll((timestamp()),"-","")),"T","_")),":","")}</message-->
    <message>Timestamp - ${current_ts}</message> <!-- this will print expression but not evaluate it -->
  </kill>
  <end name="end"/>
</workflow-app>

2 个答案:

答案 0 :(得分:0)

Parameterization of Workflows中提到:

  

EL表达式可用于操作和决策节点的配置值。它们可以用在XML属性值以及XML元素和属性值中。

它们不能用于XML元素和属性名称。它们不能在节点名称中使用,也不能在节点的过渡元素中使用。

但你可以在协调员

中使用它

答案 1 :(得分:0)

如果我在工作流中创建global-&gt; configuration-&gt;属性并在wf的其他操作中引用它,那么属性中的EL表达式将不会被评估。

作为一种解决方法,我将wf作为子wf包装并在父wf中创建了global-&gt; configuation-&gt;属性,然后将其传递给subwf。通过这种解决方法,EL表达式得到了评估。

家长WF:

<workflow-app xmlns="uri:oozie:workflow:0.4" name="main-wf">
  <global>
    <configuration>
      <property>
        <name>run_ts</name>
        <value>${replaceAll((replaceAll((replaceAll((timestamp()),"-","")),"T","_")),":","")}</value>
      </property>
    </configuration>
  </global>

 <action name="tbl-subwf">
    <sub-workflow>
      <app-path>${AppPath}</app-path>
      <propagate-configuration/>
 </sub-workflow>
    <ok to="join-node"/>
    <error to="fail"/>
  </action>
 <kill name="fail">
    <message>Sub workflow failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
  </kill>
  <end name="end"/>
</workflow-app>