定义

http://oozie.apache.org
Oozie是一个管理 Apache Hadoop 作业的工作流调度系统。
Oozie的 workflow jobs 是由 actions 组成的 有向无环图(DAG)。
Oozie的 coordinator jobs 是由时间 (频率)和数据可用性触发的重复的 workflow jobs。
Oozie与Hadoop生态圈的其他部分集成在一起,支持多种类型的Hadoop作业(如Java map-reduce、流式map-reduce、Pig、Hive、Sqoop和Distcp)以及特定于系统的工作(如ava程序和shell脚本)。
Oozie是一个可伸缩、可靠和可扩展的系统。

Oozie架构图

image.png

架构原理

WorkFlow工作流

工作流,由我们需要处理的每个工作组成,进行需求的流式处理,是对要进行的顺序化工作的抽象。

Coordinator调度器

协调器,可以理解为工作流的协调器,可以将多个工作流协调成一个工作流来进行处理,是对要进行的顺序化的workflow的抽象。

Bundler

将一堆的coordinator进行汇总处理,是对一堆coordiantor的抽象。

Oozie作业

Oozie的作业有三部分组成,分别是job.properties,workflow.xml,lib文件夹。

job.properties

配置作业(job)中用到的各种参数的,总结如下:
image.png
一个简单的job.properties文件如下:

  1. nameNode=hdfs://cm1:8020
  2. jobTracker=cm1:8032
  3. queueName=default
  4. examplesRoot=examples
  5. oozie.wf.application.path=${nameNode}/user/workflow/oozie/shell

workflow.xml

定义任务的整体流程的文件,需要注意的有三点:版本信息,EL函数,节点信息。

版本信息

在xmls属性中定义了workflow的版本为0.4,workflow的版本不能高于oozie兼容的最高版本,可以降低。

<workflow-app xmlns="uri:oozie:workflow:0.4" name="${sys_name}-MonitorPlus-Task-${task_id}">

EL函数

常用的EL函数有基本的EL函数,workFlow EL函数和HDFSEL函数。

节点信息

Oozie的节点分成两种,流程控制节点和动作节点。所谓的节点实际就是一组标签。两种节点分别如下:

  • 流程控制节点
    ——定义workflow的开始
    ——定义workflow的结束
    ——实现switch功能
    标签连用
    ——调用子workflow
    ——程序出错后跳转到这个节点执行相关操作
    ——并发执行workflow
    ——并发执行结束(与fork一起使用)
  • 动作节点
    ——表示运行的是shell操作
    ——表示运行的java程序
    ——表示是对hdfs进行操作
    ——表示进行的是MR操作
    ——表示进程的是hive操作
    ——表示进行的是sqoop的相关操作

文件需要被放在HDFS上才能被oozie调度,如果在启动需要调动MR任务,jar包同样需要在hdfs上。最终的目录结构如下:

 /xxx/oozie/workflow.xml  
 /xxx/oozie/lib  
 /xxx/oozie/lib/mr-1.7-SNAPSHOT-**package**.jar  
 /xxx/oozie/lib/xxx.mr-1.7-SNAPSHOT-**package**.jar

完整示例

  <workflow-app xmlns="uri:oozie:workflow:0.4" name="${sys_name}-MonitorPlus-Task-${task_id}">
      <start to=“check-xxx-succ-flag"/>

      <decision name=“check-xxx-succ-flag">
          <switch>
  <case to="check-mr-succ-flag">${fs:exists(concat(concat("/xxx/output/xxxList/",
       task_id),"/_SUCCESS"))}</case>
  <default to=“do-xxx"/>
          </switch>
     </decision>

     <decision name="check-mr-succ-flag">
         <switch>
             <case to="end">${fs:exists(concat(concat(“/xxx/output/", task_id),"/_SUCCESS"))}</case>
             <default to="do-mr"/>
         </switch>
     </decision>

     <action name=“do-xxx" retry-max="3" retry-interval="10">
         <java>
             <job-tracker>${jobTracker}</job-tracker>
             <name-node>${namenode}</name-node>
             <configuration>
                 <property>
                     <name>mapreduce.job.queuename</name>
                     <value>${queueName}</value>
                 </property>
             </configuration>
            <main-class>com.xxx.Main</main-class>
          </java>
        <ok to=”end”/>
        <error to=”fail”/>
     </action>
     <kill name=”fail”>
         <message>Map/Reduce failed.error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
     </kill>
     <end name=”end”/>
 </workflow-app>

lib

在workflow工作流定义的同级目录下,需要有一个lib目录,在lib目录中存在java节点MapReduce使用的jar包。需要注意的是,oozie并不是使用指定jar包的名称来启动任务的,而是通过制定主类来启动任务的。在lib包中绝对不能存在某个jar包的不同版本,不能够出现多个相同主类。