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()
格式化为第二个,但在协调器中 - 因此您必须将结果填充到<configuration>
属性中以将其转发到工作流脚本。
AFAIK coord:actualTime()
指的是过去一个不确定的时间,当协调器开始考虑其下一个工作流实例时。我无法想象它可以用来做什么。
顺便说一句,我不明白“[你]实际上想要做什么”;如果您只想为您的操作生成唯一的 ID,那么您有很多方法可以做到这一点,而无需依赖 Oozie 很慢并且不会在同一秒内执行多个操作这一事实。
【讨论】:
我指的是[此链接| oozie.apache.org/docs/3.3.0/… ] 这显然给了我过时的信息。感谢您的指正。我想要做的是从多个操作传递一个日期时间值作为命令行参数,我希望它们都是相同的值。我想检查 timestamp() 是否适用,或者我是否应该使用nominalTime()/actualTime()。似乎 timestamp() 会在动作运行时准确地给我时间值,因此对我没有用;但只是测试一下。 从协调器的角度来看,coord:nominalTime()
传递给 Workflow 参数将为您提供 wf 应该 开始的时间。如果您在工作流脚本的头部定义一个明确的<parameter>
,并使用timestamp()
分配一个值,那么它将为您提供工作流实际开始运行的时间。
谢谢。我通过在电子邮件之间插入 java 操作(一个可以使用 Thread.Sleep(60*1000) 的 jar)让我的测试开始工作。您将 timestamp() 声明为 <parameters>
只接受字面值,稍后替换。我的建议不起作用。你被coord:nominalTime()
卡住了,除非别人有更好的主意:-/以上是关于Oozie Workflow EL 函数 timestamp() 不给出秒数的主要内容,如果未能解决你的问题,请参考以下文章
我需要在oozie 中的workflow.xml 和job.properties 中提供配置吗?
Oozie-自定义实现WorkFlow中shell action
oozie 作业失败并出现错误 JA009:错误的 conf 文件