Oozie Workflow EL函数timestamp()不给秒

时间:2016-01-27 20:08:06

标签: hadoop oozie oozie-coordinator bigdata

我有以下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 个答案:

答案 0 :(得分:1)

引用Oozie documentation for V4.2

  

4.2.2基本EL功能

     

字符串时间戳()

     

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

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

如果您愿意,可以将coord:nominalTime()格式化为秒,但协调器中的 - 因此您必须将结果填入<configuration>属性以将其转发给工作流脚本。

AFAIK coord:actualTime()指的是过去协调员开始考虑其下一个Workflow实例时的非确定性时间。我无法想象它可以用于什么。

顺便说一下,我没有“你实际上想做什么”;如果你想要的只是为你的动作生成唯一的ID,你有很多方法可以做到这一点,而不依赖于Oozie很慢并且不会在同一秒内执行多个动作的事实。