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
Copyright © 尚硅谷大数据 2019 all right reserved,powered by Gitbook
该文件最后修订时间: 2019-03-28 11:17:42

results matching ""

    No results matching ""