首页 > 解决方案 > 在 Oozie 工作流中将值从 Java 操作传递到下一个 Java 操作

问题描述

我有两个用 Oozie workflow.xml 编写的 java 动作。我想将我的第一个 java 操作的输出传递给下一个 java 操作以供重用。

我知道这需要使用“oozie.action.output.properties”来完成。在第一个动作中,我设置了输出参数“buildFileName”,如下所示:

File file = new File(System.getProperty("oozie.action.output.properties"));
LOGGER.info("SystemGetProperty:" + System.getProperty("oozie.action.output.properties").toString());
Properties props = new Properties();
props.setProperty("buildFileName", buildFileName);
OutputStream os= new FileOutputStream(file);
props.store(os, "");
os.close();

但不幸的是,在第二个动作中,我无法使用参数值。应用程序作业成功,但参数值变为空。

我的第一个 java 动作看起来像:

<action name="java-action1">
    <java>
        <main-class>XYZ.MyJavaAction</main-class>
        <arg>Args</arg>
        <capture-output />
    </java>
<ok to="java-action2"/> 
<error to="fail"/> 

我的第二个 java 动作看起来像:

<action name="java-action2">
    <java>
        <main-class>XYZ.MyJavaAction</main-class>
        <arg>{"outputFileName":"${wf:actionData('java-action1')['buildFileName']}"}</arg>
    </java>
<ok to="End"/> 
<error to="fail"/> 

谁能帮助我在这里缺少什么?

标签: javahadoophdfsoozieoozie-workflow

解决方案


谷歌搜索oozie capture_output java直接指向Java Cookbook部分“Capture-output element”,引用:

  • 在这个例子中,我们在 JAVA 动作和 PIG 动作之间传递了一个 PASS_ME 变量。
  • PASS_ME 变量在 JAVA 操作中被赋予值 123456 ...
    main()方法将属性文件写入oozie.action.output.propertiesENVIRONMENT 变量中指定的路径...
 Properties props = new Properties();
 props.setProperty("PASS_ME", "123456");
 File file = new File(System.getProperty("oozie.action.output.properties"));
 OutputStream os = new FileOutputStream(file);
 props.store(os, "");
 os.close();
  • PIG 操作随后读取 PASS_ME 变量的值并将其传递给 PIG 脚本...
    <param>MY_VAR=${wf:actionData('java1')['PASS_ME']}</param>

推荐阅读