【问题标题】:Is it possible to log a message from an Oozie Workflow without killing it是否可以在不杀死 Oozie 工作流的情况下记录消息
【发布时间】: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。

标签: oozie oozie-coordinator


【解决方案1】:

我可以看到的一种方法是,您可以在工作流的末尾放置一个 shell 脚本,并将值作为参数记录到 shell 脚本中。在 shell 脚本中将这些参数的值写入文件并将文件复制到 hdfs。

工作完成后,您可以检查存储在 hdfs 中的文件中这些属性的值。

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-11
    • 2013-08-05
    • 2012-05-07
    • 1970-01-01
    • 2019-02-08
    • 1970-01-01
    相关资源
    最近更新 更多