问题摘要
运行Oozie协调器时,我需要工作流能够访问格式为yyyyMMdd
的当前日期(即协调器运行的日期)。
信息
我有一个由协调员初始化的大型Oozie工作流程。
coord.properties
nameNode=<namenode>
jobTracker=<jobtracker>:8050
queueName=default
oozie.use.system.libpath=true
oozie.libpath=${nameNode}/project/workflow/lib
oozie.coord.application.path=${nameNode}/project/workflow
coordinator.xml:
<?xml version="1.0" encoding="UTF-8"?>
<coordinator-app xmlns="uri:oozie:coordinator:0.1" name="wf_scheduler" frequency="${coord:days(1)}" start="2015-01-30T08:50Z" end="2017-01-30T05:00Z" timezone="UTC">
<action>
<workflow>
<app-path>${nameNode}/project/workflow</app-path>
<configuration>
<property>
<name>currentDate</name>
<value>${coord:actualTime()}</value>
</property>
<property>
<name>runDate</name>
<value>${convertDate(currentDate,"YYYY-MM-DDTHH:mmZ","yyyyMMdd")}</value>
</property>
</configuration>
</workflow>
</action>
</coordinator-app>
从
job.properties
(即不是协调器)运行此工作流程时,我在runDate=20150125
中具有job.properties
属性。显然,从协调员运行时,我需要每天由协调员设置runDate
。这似乎微不足道,但我找不到解决方案。我已经在
oozie.service.ELService.ext.functions.workflow
中提到了EL函数,该函数允许我给出一个代表日期,日期格式和所需输出格式的字符串,然后以该格式返回字符串date。即${convertDate("20150125", "yyyyMMdd", "yyyy-MM-dd") = 2015-01-25
。从job.properties
运行时,此功能可以完美运行,而我的理想解决方案是能够在coordinator.xml中使用它。但是,提交协调器时出现以下错误:Error: E1004 : E1004: Expression language evaluation error, Unable to evaluate :${convertDate(currentDate,"YYYY-MM-DDTHH:mmZ","yyyyMMdd")}:
最佳答案
您可能会发现使用内置的EL函数coord:formatTime(String timeStamp, String format)
转换时间戳格式更加容易:
https://oozie.apache.org/docs/4.1.0/CoordinatorFunctionalSpec.html#a6.9.2._coord:formatTimeString_ts_String_format_EL_Function_since_Oozie_2.3.2
例如:
${coord:formatTime(coord:actualTime(), "yyyyMMdd")}
关于hadoop - 将Oozie协调器的运行日期传播到工作流中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28232569/