Oozie 学习笔记 (一)---入门学习

目录

Oozie是什么

        Oozie 的架构

Oozie 基本原理

        概括的知识框架

 Oozie 调度 shell 脚本

       Oozie 定时调度


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.propertiesworkflow.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/${user.name}/${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>mapred.job.queue.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/${user.name}/${examplesRoot}/cron-job/coordinator.xml
start=2019-10-31T14:30+0800
end=2019-10-31T14:40+0800
EXEC=hello.sh
workflowAppUri=${nameNode}/user/${user.name}/${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>mapred.job.queue.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  生态圈的 客户端

发布了114 篇原创文章 · 获赞 143 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/qq_35995514/article/details/102822245