Hadoop工作流引擎之Oozie3.3.2
介绍
Oozie是一个由Yahoo开发,用于运行Hadoop工作流的开源工作流引擎。作为一个Java Web程序,它运行在Java Servlet容器中,如Tomcat,并且使用数据库来存储Hadoop工作流的定义和当前运行实例包括实例的状态和变量等。Oozie目前支持的任务包括M/R Job,Streaming Job ,Pig,Hive,Distcp,PoJo Java,SSH,Sqoop,开发人员也可以通过写插件自定义任务类型。
Oozie可以通过命令、Java API、Web UI(只能查看Job状态,不能提交Job)和Web Services API四种方式对外提供服务,其中前两种较常用。
Oozie系统主要包括工作流和协调系统两个概念。- workflow定义是一个带 流程控制节点(start、end、decision、fork、join、kill)和 action节点(map-reduce、pig等)的有向图(DAG)。workflow definition language基于XML,被称为HPDL(Hadoop Process Definition Language)。Oozie不支持在流程定义中循环,流程定义必须是严格的有向图。在workflow应用发布时,如果oozie探测到在wokflow定义中存在环,则发布失败。所有由动作节点触发的计算和处理任务都不在Oozie之中——它们是由Hadoop的Map/Reduce框架执行的,这种方法让Oozie可以支持现存的Hadoop用于负载平衡、灾难恢复的机制。相关细节可以参考http://oozie.apache.org/docs/3.3.2/WorkflowFunctionalSpec.html
- Oozie协调系统目前支持时间上的定时执行和数据可用来激活任务调度两种方式。一些工作流是根据需要(基于一定的时间段和(或)数据可用性和(或)外部事件)来运行它们。Oozie协调系统(Coordinator system)让用户可以基于这些参数来定义工作流执行计划。Oozie协调程序让我们可以以谓词的方式对工作流执行触发器进行建模,可以指向数据、事件和(或)外部事件。工作流作业会在谓词得到满足的时候启动。经常我们还需要连接定时运行、但时间间隔不同的工作流操作。多个随后运行的工作流的输出会成为下一个工作流的输入。把这些工作流连接在一起,会让系统把它作为数据应用的管道来引用。Oozie协调程序支持创建这样的数据应用管道。
关于coordinator的使用有很多细节,相关细节可以参考http://oozie.apache.org/docs/3.3.2/CoordinatorFunctionalSpec.html#a6._Coordinator_Application
Oozie工作方式是启动一个mapper任务(这个任务启动真正任务)放在cluster上面运行。大致上来看的话需要几个文件:
- workflow.xml ozzie读取它来知道每个任务DAG如何并且失败以及成功之后如何处理。需要提交到hdfs上面。
- coordinator.xml 如果是coordinator模式的话,还需要这个文件。需要提交到hdfs上面。
- job.properties 这个用来存放一些任务相关的参数等。这个部分其实可以和workflow.xml放在一起,但是分离出来的话可以方便分离。本地使用。
- lib 目录下面存放启动启动需要的库文件比如jar或者是so等。需要提交到hdfs上面。
然后我们需要将这些文件(job.properties不许要上传)提交到hdfs上面,然后使用ozzie启动。此外oozie也有local-mode方便调试和测试。
Oozie执行分为三种模式:
- workflow. 这种方式非常简单,就是定义DAG来执行。
- coordinator. workflow缺点非常明显,就是没有办法定时触发或者是条件触发。coordinator可以完成这个需求。coordinator构建在workflow工作方式上面,可以定时运行也可以触发运行。
触发条件非常巧妙,提供一个叫做synchronous dataset的数据集。这个数据集其实就是一个url(文件系统url),不过这个url通过时间来进行区分。比如hdfs://foo:9000/usr/logs/2009/04/15/23/30. - bundle. bundle的作用就是将多个coordinator管理起来。这样我们只需要提供一个bundle提交即可。然后可以start/stop/suspend/resume任何coordinator.
其他相关细节可参考Oozie主页http://oozie.apache.org/docs/3.3.2/index.html
安装步骤
首先准备安装Oozie需要的软件
官方要求
Unix box (tested on Mac OS X and Linux)
Java JDK 1.6+
Maven 3.0.1+
Hadoop 0.20.2+
Pig 0.7+
我采用的软件
Linux Ubuntu12.04
Java JDK 1.7.0_17
apache-maven-3.0.5
Hadoop 1.0.4
Pig pig-0.11.1
Mysql 5.5.31(oozie默认使用Derby数据库)
ext2.2(可选,访问Web UI需要用)
相关环境变量的配置如下:
#JAVA
JAVA_HOME=/home/supertool/soft/jdk1.7.0_17
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
export JAVA_HOME
export PATH
export CLASSPATH
#hadoop
HADOOP_HOME=/home/supertool/soft/hadoop-1.0.4
PATH=$HADOOP_HOME/bin:$PATH
CLASSPATH=$CLASSPATH:$HADOOP_HOME:$HADOOP_HOME/lib
export HADOOP_HOME
export PATH
export CLASSPATH
#maven
export MVN_HOME=/home/supertool/soft/apache-maven-3.0.5
#oozie
OOZIE_HOME=/home/supertool/soft/oozie-3.3.2/distro/target/oozie-3.3.2-distro/oozie-3.3.2
PATH=$OOZIE_HOME/bin:$MVN_HOME/BIN:$PATH
export OOZIE_HOME PATH
export OOZIE_URL=http://localhost:11000/oozie
#pig
export PIG_HOME=/home/supertool/soft/pig-0.11.1
export PIG_CLASSPATH=$HADOOP_HOME/conf
export PATH=$PIG_HOME/bin:$PIG_CLASSPATH:$PATH
编译Oozie
编译只需要一条命令。需要注意的是目前不支持Hadoop 1.1.1版本,而且Hadoop 2.x也存在风险。此外编译需要下载的软件很多,可能需要较长时间(我第一次用了三个多小时)
$ bin/mkdistro.sh -DskipTests
我编译完的 主目录地址
/home/supertool/soft/oozie-3.3.2/distro/target/oozie-3.3.2-distro/oozie-3.3.2
安装Mysql
安装M