如果需要做一个循环的定时调度,基本的需要三个文件
- job.properties 记录了job的属性
- workflow.xml 使用hPDL 定义任务的流程和分支
- coordinator.xml 主要用来做workflow的触发条件,来做定时触发,也可以组合多个workflow的运行顺序
现在讲解一个简单的demo,对ooize进行说明讲解
job.properties 该文件主要是设置一些参数信息和公共变量
# 集群参数
#nameNode地址
nameNode=hdfs://master:8020
nameNode=hdfs://master:8020
#resourceManager地址
jobTracker=master:8032
jobTracker=master:8032
#oozie队列 这个属性一般不做修改
queueName=default
# oozie
# oozie
#coordinator.xml在hdfs上的路径
oozie.coord.application.path=${nameNode}/work/coordinator.xml
oozie.coord.application.path=${nameNode}/work/coordinator.xml
#workflow.xml在hdfs上的路径
workflowAppUri=${nameNode}/work/workflow.xml
workflowAppUri=${nameNode}/work/workflow.xml
#workflow的名字
workflowName=workflow
workflowName=workflow
#定时任务的开始时间 以UTC时区为准
start=2016-11-03T09:00Z
start=2016-11-03T09:00Z
#定时任务的结束时间
end=2019-07-30T16:00Z
# shell脚本所在路径或者需要执行的jar包所在的路径
jarsDir=/home/jar
# shell脚本所在主机或者需要执行的jar包所在的主机
sshHost=namenode2
end=2019-07-30T16:00Z
# shell脚本所在路径或者需要执行的jar包所在的路径
jarsDir=/home/jar
# shell脚本所在主机或者需要执行的jar包所在的主机
sshHost=namenode2
workflow.xml
<workflow-app xmlns="uri:oozie:workflow:0.2" name="${workflowName}">
<start to="SchedulerMain"/> --启动的action的名称
<action name="SchedulerMain">
<ssh xmlns="uri:oozie:ssh-action:0.1">--该动作节点的意思是登录一台机器,然后执行一条shell命令
<host>root@${sshHost}</host>
<command>hadoop jar ${jarsDir}/SchedulerMain.jar</command> --需要执行的具体脚本
</ssh>
<ok to="end"/> --执行成功以后跳转的节点
<error to="fail"/>--执行失败以后跳转的节点
</action>
<kill name="fail">
<message>Java failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
</kill>
<end name="end"/>
</workflow-app>
<action name="SchedulerMain">
<ssh xmlns="uri:oozie:ssh-action:0.1">--该动作节点的意思是登录一台机器,然后执行一条shell命令
<host>root@${sshHost}</host>
<command>hadoop jar ${jarsDir}/SchedulerMain.jar</command> --需要执行的具体脚本
</ssh>
<ok to="end"/> --执行成功以后跳转的节点
<error to="fail"/>--执行失败以后跳转的节点
</action>
<kill name="fail">
<message>Java failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
</kill>
<end name="end"/>
</workflow-app>
coordinator.xml
#frequency执行频率 ${coord:minutes(5)}为coordinator内置的EL function (Expression Language)
<coordinator-app name="coordinator" frequency="${coord:minutes(5)}" start="${start}" end="${end}" timezone="UTC" xmlns="uri:oozie:coordinator:0.2">
<action>
<workflow>
<app-path>${workflowAppUri}</app-path>
<configuration>
<property>
<name>jobTracker</name>
<value>${jobTracker}</value>
</property>
<property>
<name>nameNode</name>
<value>${nameNode}</value>
</property>
<property>
<name>queueName</name>
<value>${queueName}</value>
</property>
</configuration>
</workflow>
</action>
</coordinator-app>
<action>
<workflow>
<app-path>${workflowAppUri}</app-path>
<configuration>
<property>
<name>jobTracker</name>
<value>${jobTracker}</value>
</property>
<property>
<name>nameNode</name>
<value>${nameNode}</value>
</property>
<property>
<name>queueName</name>
<value>${queueName}</value>
</property>
</configuration>
</workflow>
</action>
</coordinator-app>
EL常量
常量表示形式 | 含义说明 |
${coord:minutes(int n)} | 返回日期时间:从一开始,周期执行n分钟 |
${coord:hours(int n)} | 返回日期时间:从一开始,周期执行n * 60分钟 |
${coord:days(int n)} | 返回日期时间:从一开始,周期执行n * 24 * 60分钟 |
${coord:months(int n)} | 返回日期时间:从一开始,周期执行n * M * 24 * 60分钟(M表示一个月的天数) |
${coord:endOfDays(int n)} | 返回日期时间:从当天的最晚时间(即下一天)开始,周期执行n * 24 * 60分钟 |
${coord:endOfMonths(1)} | 返回日期时间:从当月的最晚时间开始(即下个月初),周期执行n * 24 * 60分钟 |
${coord:current(int n)} | 返回日期时间:从一个Coordinator动作(Action)创建时开始计算,第n个dataset实例执行时间 |
${coord:dataIn(String name)} | 在输入事件(input-events)中,解析dataset实例包含的所有的URI |
${coord:dataOut(String name)} | 在输出事件(output-events)中,解析dataset实例包含的所有的URI |
${coord:offset(int n, String timeUnit)} | 表示时间偏移,如果一个Coordinator动作创建时间为T,n为正数表示向时刻T之后偏移,n为负数向向时刻T之前偏移,timeUnit表示时间单位(选项有MINUTE、HOUR、DAY、MONTH、YEAR) |
${coord:hoursInDay(int n)} | 指定的第n天的小时数,n>0表示向后数第n天的小时数,n=0表示当天小时数,n<0表示向前数第n天的小时数 |
${coord:daysInMonth(int n)} | 指定的第n个月的天数,n>0表示向后数第n个月的天数,n=0表示当月的天数,n<0表示向前数第n个月的天数 |
${coord:tzOffset()} | ataset对应的时区与Coordinator Job的时区所差的分钟数 |
${coord:latest(int n)} | 最近以来,当前可以用的第n个dataset实例 |
${coord:future(int n, int limit)} | 当前时间之后的dataset实例,n>=0,当n=0时表示立即可用的dataset实例,limit表示dataset实例的个数 |
${coord:nominalTime()} | nominal时间等于Coordinator Job启动时间,加上多个Coordinator Job的频率所得到的日期时间。例如:start=”2009-01-01T24:00Z”,end=”2009-12-31T24:00Z”,frequency=”${coord:days(1)}”,frequency=”${coord:days(1)},则nominal时间为:2009-01-02T00:00Z、2009-01-03T00:00Z、2009-01-04T00:00Z、…、2010-01-01T00:00Z |
${coord:actualTime()} | Coordinator动作的实际创建时间。例如:start=”2011-05-01T24:00Z”,end=”2011-12-31T24:00Z”,frequency=”${coord:days(1)}”,则实际时间为:2011-05-01,2011-05-02,2011-05-03,…,2011-12-31 |
${coord:user()} | 启动当前Coordinator Job的用户名称 |
${coord:dateOffset(String baseDate, int instance, String timeUnit)} | 计算新的日期时间的公式:newDate = baseDate + instance * timeUnit,如:baseDate=’2009-01-01T00:00Z’,instance=’2′,timeUnit=’MONTH’,则计算得到的新的日期时间为’2009-03-01T00:00Z’。 |
${coord:formatTime(String timeStamp, String format)} | 格式化时间字符串,format指定模式 |
oozie job -config /root/app/job.properties -run 启动oozie 执行具体的配置文件
文章参考列表:
http://blackproof.iteye.com/blog/1928122
http://shiyanjun.cn/archives/684.html
http://www.cnblogs.com/en-heng/p/5581331.html