【发布时间】:2016-04-21 11:07:40
【问题描述】:
我有一个有点复杂的 Oozie 工作流程,我希望能够查看流程中各个点的一些属性。显而易见的解决方案是简单地将消息写入日志。
我已经查看了official documentation,似乎唯一支持记录的操作是 Kill 操作!
有没有办法在不终止工作流的情况下记录一组属性?
更新(提供更多细节)
所以想象一下我的(简化的)工作流程如下所示:
<workflow-app name="myWorkflow" xmlns="uri:oozie:workflow:0.5">
<start to="action1"/>
<kill name="Kill">
<message>Failed: error ${myField}</message>
</kill>
<action name='action1'>
<java>
<job-tracker>${jobTracker}</job-tracker>
<name-node>${nameNode}</name-node>
<configuration>
<property>
<name>mapred.job.queue.name</name>
<value>default</value>
</property>
</configuration>
<main-class>my.Class</main-class>
<arg>${myArgument}</arg>
<capture-output/>
</java>
<ok to="action2" />
<error to="Kill" />
</action>
<action name='action2'>
<ok to="End" />
<error to="Kill" />
</action>
<end name="End"/>
</workflow-app>
在工作流程中,我有名为 ${myField}、${myArgument}、${jobTracker} 和 ${nameNode} 的字段。其中一些是启动过程设置的属性,其他的将由我从“action1”调用的 Java 类设置。 在执行“action1”和“action2”之间,我想记录这些字段的值。我不太关心这些值记录到哪里,我只需要能够看到这些值是什么。
我不想调用我的“kill”操作来进行日志记录,因为运行“action2”很重要。
【问题讨论】:
-
您是指
kill节点中的message元素吗?您在谈论哪种日志以及要打印哪些属性? -
@YoungHobbit,我在问题中添加了更多细节,应该更详细地解释问题。简短的回答是我想记录任何可用作 Oozie 表达式的变量。我不在乎我写什么日志,我只关心我以后可以读到的东西。
-
${myField}, ${myArgument}, ${jobTracker} and ${nameNode}所有这些都将在job.properties文件中定义。others will be set by the Java class I call from 'action1'.是什么意思你想在一个动作中写一些属性,然后想在下面的动作中使用它们,因为它们是不同的机制。我确定您在这里需要什么。 -
有点,但是... 1) 我有多个 job.properties 文件,2) 我的 Java 任务有一些“魔法”(实际上是在读取数据库)来检索数据和使用它更新几个属性。这些将在稍后的工作流程中使用。
-
Oozie 在提交作业时只接受一个属性文件。您需要编写这些额外的属性,这些属性在 java 操作中计算并用于向下操作。您可以使用
System.getProperty("oozie.action.output.properties")文件并将您的key=value对写入其中。此外,您可以通过${wf:actionData('java_action_name')['key']}访问这些内容。您可以写入的最大数据为 2KB。