定义
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架构图
架构原理
WorkFlow工作流
工作流,由我们需要处理的每个工作组成,进行需求的流式处理,是对要进行的顺序化工作的抽象。
Coordinator调度器
协调器,可以理解为工作流的协调器,可以将多个工作流协调成一个工作流来进行处理,是对要进行的顺序化的workflow的抽象。
Bundler
将一堆的coordinator进行汇总处理,是对一堆coordiantor的抽象。
Oozie作业
Oozie的作业有三部分组成,分别是job.properties,workflow.xml,lib文件夹。
job.properties
配置作业(job)中用到的各种参数的,总结如下:
一个简单的job.properties文件如下:
nameNode=hdfs://cm1:8020
jobTracker=cm1:8032
queueName=default
examplesRoot=examples
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包的不同版本,不能够出现多个相同主类。