当有一个复杂的工作流job,希望每天定时执行,使用crontab方式调用需要编写大量的脚本,还要通过大量的判断来控制每个工作流job的执行顺序问题。Oozie中的Coordinator可以让每个工作流workflow当做一个动作来运行,这样就可以将多个job组织起来,并制定触发时间和频率。它的调度方式有两种:一种是基于时间调度;还有一种是基于数据可用性调度(判断数据是否存在和是否符合标准)。
- 如果要设置基于时间的调度,需要先配置时区,因为oozie默认使用的是UTC时区,服务器默认使用的是CST,我们把他们修改为GMT +0800(当然也可以是其他时区)
查看系统当前时区:
如果输出的时区不是+0800,需要进行修改
修改oozie时区,在oozie-sitexml添加参数$ rm -rf /etc/localtime $ ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
修改oozie/-server/webapps/oozie/oozie-console.js中的时区设置,不然会影响web界面的时间,修改完成后重启生效<property> <name>oozie.processing.timezone</name> <value>GMT+0800</value> </property>
function getTimeZone() { Ext.state.Manager.setProvider(new Ext.state.CookieProvider()); return Ext.state.Manager.get("TimezoneId","GMT+0800"); }
- 拷贝模板中的coordinator案例
$ cp -r examples/apps/cron-schedule/ my-apps/
- 修改job.properties
nameNode=hdfs://bigdata-00:8020 jobTracker=bigdata-00:8032 queueName=default examplesRoot=user/wulei/my-apps/cron-schedule # 定义coordinate路径 oozie.coord.application.path=${nameNode}/${examplesRoot} start=2016-11-13T12:30+0800 end=2016-11-13T13:30+0800 # 定义workflow路劲 workflowAppUri=${nameNode}/${examplesRoot}
- 修改coorndinate.xml,让这个任务从开始时间到结束时间内每分钟执行一次
<coordinator-app name="cron-coord" frequency="${coord:minutes(1)}" start="${start}" end="${end}" timezone="GMT+0800" 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>
- oozie的默认配置中,至少为每5分钟执行一次,所以需要修改默认配置
- 上传至hdfs后执行
- 查看执行结果