4.4 案例四: Oozie 定时任务/循环任务
目标: Coordinator周期性调度任务
4.4.1 统一时区
由于涉及到时间, 所以每台设备都要应该统一时区. 我们统一都设定为东八区时区.
输入date -R
如果显示 +0800
时区就是正确的. 否则需要设置时区为东八区.
输入命令:tzselect
然后一步步的选择即可选择到正确的时区.
然后与Internet 服务器同步时间:
sudo ntpdate pool.ntp.org
开启定时任务, 周期的同步时间(使用root用户执行): 每隔 1 小时从 Internet 同步一次时间
crontab -e
* */1 * * * /usr/sbin/ntpdate pool.ntp.org
在每台虚拟机上都执行一遍上述操作.
4.4.2 配置任务
步骤1: 配置 oozie-site.xml
把时区更改为东八区.
<property>
<name>oozie.processing.timezone</name>
<value>GMT+0800</value>
</property>
步骤2: 修改 js 框架中的关于时间设置的代码
vim /opt/module/cdh/oozie-4.0.0-cdh5.3.6/oozie-server/webapps/oozie/oozie-console.js
修改如下:
function getTimeZone() {
Ext.state.Manager.setProvider(new Ext.state.CookieProvider());
return Ext.state.Manager.get("TimezoneId","GMT+0800");
}
步骤3: 重启 Oozie
bin/oozied.sh stop
bin/oozied.sh start
步骤4: 拷贝官方模板配置定时任务
cp -r examples/apps/cron oozie-apps/
步骤5: 修改 job.properties
nameNode=hdfs://hadoop201:8000
jobTracker=hadoop202:8032
queueName=default
examplesRoot=examples
oozie.coord.application.path=${nameNode}/user/${user.name}/${examplesRoot}/cron
# 任务的开始时间和结束时间, 必须是未来的时间
start=2018-11-20T11:45+0800
start=2018-11-20T13:45+0800
workflowAppUri=${nameNode}/user/${user.name}/${examplesRoot}/cron
EXEC3=p3.sh
步骤6: 修改 coordinator.xml
<coordinator-app name="cron-coord" frequency="${coord:minutes(5)}" 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 分钟, 如果设置低于 5 分钟会抛出异常.
可以在
oozie-site.xml
中添加如下属性, 来关闭频率检查.<property> <name>oozie.service.coord.check.maximum.frequency</name> <value>false</value> </property>
所有的频率都是以分钟来算的. 给的常量值不能超过1天的分钟数. 所以, 官方提供了日和月
官方支持的频率:
也支持 linux 系统的
crontab
定时方式 例如: 每隔1分钟执行一次frequency="*/1 * * * *"
步骤7: 修改 workflow.xml
<workflow-app xmlns="uri:oozie:workflow:0.5" name="one-op-wf">
<start to="p3-shell-node"/>
<action name="p3-shell-node">
<shell xmlns="uri:oozie:shell-action:0.2">
<job-tracker>${jobTracker}</job-tracker>
<name-node>${nameNode}</name-node>
<configuration>
<property>
<name>mapred.job.queue.name</name>
<value>${queueName}</value>
</property>
</configuration>
<exec>${EXEC3}</exec>
<file>/user/atguigu/oozie-apps/cron/${EXEC3}#${EXEC3}</file>
<capture-output/>
</shell>
<ok to="end"/>
<error to="fail"/>
</action>
<kill name="fail">
<message>Shell action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
</kill>
<kill name="fail-output">
<message>Incorrect output, expected [Hello Oozie] but was [${wf:actionData('shell-node')['my_output']}]</message>
</kill>
<end name="end"/>
</workflow-app>
步骤8: 上传配置
/opt/module/cdh/hadoop-2.5.0-cdh5.3.6/bin/hdfs dfs -put oozie-apps/cron/ /user/atguigu/oozie-apps
步骤9: 开启任务
bin/oozie job -oozie http://hadoop201:11000/oozie -config oozie-apps/cron/job.properties -run