oozie4.1.x 定时执行shell脚本

说明

使用 oozie 更多的应用场景是 执行定时任务

创建 工作目录

在 /program/oozie-4.1.0-cdh5.14.0 目录下创建 oozie_apps 目录

cd /program/oozie-4.1.0-cdh5.14.0
mkdir oozie_apps

编写shell

创建 目录

在 oozie_apps 目录下创建 std3_timer 目录

cd oozie_apps
mkdir std3_timer
cd std3_timer

编写脚本

vim test_oozie.sh

内容如下:

echo hello world >> /program/oozie_hello.txt

测试脚本是否可执行

修改权限:

chmod 777 test_oozie.sh

执行脚本:

./test_oozie.sh

执行结果:在 /program/ 目录下生成 oozie_hello.txt 文件,内容是:

hello world

最后一定要删除 /program/oozie_hello.txt 文件,不然验证 oozie是否正确执行该脚本

编写 job.properties

在 std3_timer 目录下创建 job.properties 文件

vim job.properties

内容如下:

nameNode=hdfs://hadoop1:8020
jobTracker=hadoop2:8032
queueName=default
examplesRoot=oozie_apps

oozie.coord.application.path=${nameNode}/${examplesRoot}/std3_timer/coordinator.xml
# 必须设置为未来时间
start=2021-11-21T18:50+0800
end=2022-11-21T18:25+0800
EXEC=test_oozie.sh
workflowAppUri=${nameNode}/${examplesRoot}/std3_timer/workflow.xml
shellpath=/${examplesRoot}/std3_timer/${EXEC}

解释:

  • start:开始时间,一定要 未来时间,否则会出问题,见 链接
  • end:结束时间,也要未来时间
  • workflowAppUri:hdfs上的 workflow.xml 路径
  • nameNode:namenode ip、port
  • jobTracker:resources Manager ip、port
  • queueName:默认队列
  • examplesRoot:工作目录
  • oozie.coord.application.path:hdfs上的 coordinator.xml 路径
  • EXEC:要执行的脚本
  • shellpath:shell脚本在 hdfs 上的路径

编写 workflow.xml

在 std3_timer 目录下创建 workflow.xml 文件

vim workflow.xml

内容如下:

<workflow-app xmlns="uri:oozie:workflow:0.5" name="one-op-wf">
    <start to="action1"/>
    <action name="action1">
        <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>${EXEC}</exec>
            <file>${shellpath}</file>
            <capture-output/>
        </shell>
        <ok to="end"/>
        <error to="end"/>
    </action>
    <end name="end"/>
</workflow-app>

编写 coordinator

在 std3_timer 目录下创建 coordinator.xml 文件

vim coordinator.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>

解释:

上传到 hdfs

cd /program/oozie-4.1.0-cdh5.14.0/
hadoop fs -put oozie_apps /

重新上传

重新上传需要先删除 hdfs 的相关文件夹

hadoop fs -rm -r /oozie_apps/std3_timer

执行

cd /program/oozie-4.1.0-cdh5.14.0
bin/oozie job -oozie http://hadoop3:11000/oozie -config oozie_apps/std3_timer/job.properties -run

解释:

  • oozie_apps/std3_timer/job.properties:本机 job.properties 所在的路径
    写绝对路径也可以:/program/oozie-4.1.0-cdh5.14.0/oozie_apps/std3_timer/job.properties

在 oozie web查看

访问 http://hadoop3:11000

在 Coordinator 标签中可以查看结果:

在 yarn 查看结果

访问:http://hadoop2:8088/

每次启动一个 MapReduce 程序运行,由 yarn 分配 运行在哪个节点上

在服务器查看生成的文件

根据上图的提示,到 hadoop3 的 /program 目录下查找 oozie_hello.txt 文件,如果有该文件,说明任务成功

每次创建12个任务

杀死任务

bin/oozie job -oozie http://hadoop3:11000/oozie -kill 0000004-211126111024680-oozie-root-C

解释: 0000004-211126111024680-oozie-root-C 就是启动任务时显示的 job id,如下图: