一、Oozie是什么
Oozie 是一个用来管理 Hadoop 生态圈 job 的工作流调度系统。由 Cloudera 公司贡献给 Apache。Oozie 是运行于 Java servlet 容器上的一个 java web 应 用。Oozie 的目的是按照 DAG(有向无环图)调度一系列的 Map/Reduce 或者 Hive 等任务。
二、Oozie 的架构
Oozie Client:提供命令行、java api、rest 等方式,对 Oozie 的工作流 流程的提交、启动、运行等操作;
Oozie WebApp:即 Oozie Server,本质是一个 java 应用。可以使用内置的 web 容器,也可以使用外置的 web 容器;
Hadoop Cluster:底层执行 Oozie 编排流程的各个 hadoop 生态圈组件;
三、Oozie 基本原理
Oozie 对工作流的编排,是基于 workflow.xml 文件来完成的。用户预先将工 作流执行规则定制于 workflow.xml 文件中,并在 job.properties 配置相关的参数, 然后由 Oozie Server 向 MR 提交 job 来启动工作流。
四、概括的知识框架
五、 Oozie 调度 shell 脚本
准备待调度的 shell 脚本文件(输出 hello world 如下文件中)
#!/bin/bash
echo "hello world" >> /export/servers/hello_oozie.txt
修改配置模板
这里 使用Oozie 自带的模板 examples , 里面会有 job.properties 和 workflow.xml 两个文件的模板,修改即可
修改 job.properties
// core-site.xml 中 HDFS 的默认访问 地址 hadoop 2.x 默认9000
nameNode=hdfs://node01:8020
// hadoop 1.x 时的 在 hadoop2 当中只有resourceManager,这里给定 resourceManager的IP及端口
jobTracker=node01:8032
// 提交 mr 任务的队列名
queueName=default
// 指定 oozie 的工作目录; /user/root/oozie_works 存放调度任务的文件夹
examplesRoot=oozie_works
// 指定 oozie 调度资源存储于 hdfs 的工作路径;
oozie.wf.application.path=${nameNode}/user/${}/${examplesRoot}/shell
EXEC=hello.sh
修改workflow.xml
<workflow-app xmlns="uri:oozie:workflow:0.4" name="shell-wf">
<start to="shell-node"/>
<action name="shell-node">
<shell xmlns="uri:oozie:shell-action:0.2">
<job-tracker>${jobTracker}</job-tracker>
<name-node>${nameNode}</name-node>
<configuration>
<property>
<name></name>
<value>${queueName}</value>
</property>
</configuration>
// 重点 就是这里了 执行的 Job 在这个路径下,再根据 job.properties 读取配置信
// 息,执行具体的 任务
<exec>${EXEC}</exec>
<file>/user/root/oozie_works/shell/${EXEC}#${EXEC}</file>
<capture-output/>
</shell>
<ok to="end"/>
<error to="fail"/>
</action>
<decision name="check-output">
<switch>
<case to="end">
${wf:actionData('shell-node')['my_output'] eq 'Hello Oozie'}
</case>
<default to="fail-output"/>
</switch>
</decision>
<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>
上传调度任务到 HDFS中
hdfs dfs -put oozie_works/ /user/root
执行调度任务
oozie job -oozie http://node-1:11000/oozie -config oozie_works/shell/job.properties -run
终于 找到了执行后输出的文件()
六、Oozie 定时调度
在 oozie 当中,主要是通过 Coordinator 来实现任务的定时调度,Coordinator 模块主要通过 xml 来进行配置即可。
Coordinator 的调度主要可以有两种实现方式
第一种:基于时间的定时任务调度: oozie 基于时间的调度主要需要指定三个参数,第一个起始时间,第二个结 束时间,第三个调度频率;
第二种:基于数据的任务调度, 这种是基于数据的调度,只要在有了数据 才会触发调度任务。
修改配置模板
job.properties
nameNode=hdfs://node01:8020
jobTracker=node01:8032
queueName=default
examplesRoot=oozie_works
oozie.coord.application.path=${nameNode}/user/${}/${examplesRoot}/cron-job/coordinator.xml
start=2019-10-31T14:30+0800
end=2019-10-31T14:40+0800
EXEC=hello.sh
workflowAppUri=${nameNode}/user/${}/${examplesRoot}/cron-job/workflow.xml
coordinator.xml
// 这里主要是 时间 设置 我这里 是每隔 3 分钟执行一次
<coordinator-app name="cron-job" frequency="${coord:minutes(3)}" start="${start}" end="${end}" timezone="GMT+0800"
xmlns="uri:oozie:coordinator:0.4">
<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>
修改 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></name>
<value>${queueName}</value>
</property>
</configuration>
<exec>${EXEC}</exec>
<!-- <argument>my_output=Hello Oozie</argument> -->
<file>/user/root/oozie_works/cron-job/${EXEC}#${EXEC}</file>
<capture-output/>
</shell>
// 串联 任务时 当前任务 执行 OK 后, 可以执行 下一个任务
<ok to="end"/>
<error to="end"/>
</action>
<end name="end"/>
</workflow-app>
上传任务到HDFS中,执行 调度
使用http://node01:8088/cluster/apps 观察 Job
使用 Hue 观察Oozied 的 定时任务 执行 http://node01:8888/hue
我现在点进去 ,进来后就可以看见我们定时任务的执行情况
使用 Oozie自带的 Web 再 看看,这里要选择 Coordinator Jobs 因为我执行的定时 任务 http://node01:11000/oozie/
到这里感觉 hue 使用的感觉还是不错的,整合 许多 Hadoop 生态圈的 客户端