Oozie Workflow EL 函数 timestamp() 不给出秒数

Posted

技术标签:

【中文标题】Oozie Workflow EL 函数 timestamp() 不给出秒数【英文标题】:Oozie Workflow EL function timestamp() does not give seconds 【发布时间】:2016-01-27 20:08:05 【问题描述】:

我有以下 Oozie 工作流程:

<workflow-app name="$workflow_name" xmlns="uri:oozie:workflow:0.4">

    <global>
        <job-tracker>$jobTracker</job-tracker>
        <name-node>$nameNode</name-node>
        <configuration>
            <property>
                <name>mapred.job.queue.name</name>
                <value>$launcherQueueName</value>
            </property>
            <property>
                <name>mapred.queue.name</name>
                <value>$launcherQueueName</value>
            </property>
        </configuration>
    </global>

    <start to="email-1" />

    <action name="email-1">
        <email xmlns="uri:oozie:email-action:0.1">
            <to>$toEmailList</to>
            <cc>$ccEmailList</cc>
            <subject>ts</subject>
            <body> 
                TIMESTAMP:  $timestamp()
            </body>
        </email>

        <ok to="mail-2" />
        <error to="kill-fail" />
    </action>

... 4 more actions for mail-2, mail-3 and mail-4

    <kill name="kill-fail">
        <message>$workflow_name failed, error
            message[$wf:errorMessage(wf:lastErrorNode())]
        </message>
    </kill>

    <end name="end" />
</workflow-app>

我收到的电子邮件的时间戳值为

TIMESTAMP:  2016-01-27T16:19Z

根据EL的定义,应该是这样的格式:(YYYY-MM-DDThh:mm:ss.sZ

为什么我没有得到秒数?

我实际上想做的是:我想弄清楚这四个函数调用是否总是返回相同的值或不同的值。我需要一些不会改变的东西,所以如果 timestamp() 对我不起作用,那么我想考虑协调器的 NominalTime / ActualTime EL 函数。

如果我们无法获取时间戳中的秒数,有没有办法暂停每个动作,让它们在超过一分钟的时间范围内执行?

编辑: Samson Scharfrichter 总结以下答案:

1) 为什么 timestamp() 中没有秒数?

以前的版本有秒,但 version 4.2 没有。

2) 有没有可以给我秒的功能?

AFAIK 没有

3) 如何在工作流的所有动作中使用相同的时间值?

将 coord:nominalTime() 作为属性从协调器传递并在操作中多次使用。

4) 如何在工作流中暂停操作?

没有简单的方法。 使用 java 操作 - 一个带有执行 Thread.sleep() 的简单类的 jar

【问题讨论】:

【参考方案1】:

引用Oozie documentation for V4.2

4.2.2 基本 EL 函数

字符串时间戳()

它以 ISO8601 格式返回当前日期时间,精确到分钟 (yyyy-MM-ddTHH:mmZ),在 Oozie 的处理时区,即 1997-07-16T19:20Z

这似乎与你得到的非常一致。

如果您愿意,您可以将coord:nominalTime() 格式化为第二个,但在协调器中 - 因此您必须将结果填充到&lt;configuration&gt; 属性中以将其转发到工作流脚本。

AFAIK coord:actualTime() 指的是过去一个不确定的时间,当协调器开始考虑其下一个工作流实例时。我无法想象它可以用来做什么。

顺便说一句,我不明白“[你]实际上想要做什么”;如果您只想为您的操作生成唯一的 ID,那么您有很多方法可以做到这一点,而无需依赖 Oozie 很慢并且不会在同一秒内执行多个操作这一事实。

【讨论】:

我指的是[此链接| oozie.apache.org/docs/3.3.0/… ] 这显然给了我过时的信息。感谢您的指正。我想要做的是从多个操作传递一个日期时间值作为命令行参数,我希望它们都是相同的值。我想检查 timestamp() 是否适用,或者我是否应该使用nominalTime()/actualTime()。似乎 timestamp() 会在动作运行时准确地给我时间值,因此对我没有用;但只是测试一下。 从协调器的角度来看,coord:nominalTime() 传递给 Workflow 参数将为您提供 wf 应该 开始的时间。如果您在工作流脚本的头部定义一个明确的&lt;parameter&gt;,并使用timestamp() 分配一个值,那么它将为您提供工作流实际开始运行的时间。 谢谢。我通过在电子邮件之间插入 java 操作(一个可以使用 Thread.Sleep(60*1000) 的 jar)让我的测试开始工作。您将 timestamp() 声明为 的想法就是我的想法。几个挥之不去的问题:1)是否有一个工作流 EL 函数也有秒数,2)有没有简单的方法来暂停/休眠工作流中的操作 Shcarfrichter。我给属性如下 workflowTimestamp $ timestamp( ) ...但它不起作用。输出是 TIMESTAMP: $ timestamp() .. 我什至尝试使用 $wf:timestamp() ...对此有什么想法吗? 该死,看起来&lt;parameters&gt; 只接受字面值,稍后替换。我的建议不起作用。你被coord:nominalTime() 卡住了,除非别人有更好的主意:-/

以上是关于Oozie Workflow EL 函数 timestamp() 不给出秒数的主要内容,如果未能解决你的问题,请参考以下文章

oozie中如何rerun一个workflow

我需要在oozie 中的workflow.xml 和job.properties 中提供配置吗?

Oozie-自定义实现WorkFlow中shell action

oozie 作业失败并出现错误 JA009:错误的 conf 文件

OOZIE HIVE 操作 - workflow.xml 属性不会传递给子任务

Oozie workflow工作流action间参数传递实现