Oozie是一个开源的工作流调度系统,它能够管理逻辑复杂的多个Hadoop作业,按照指定的顺序将其协同运行起来。例如,我们可能有这样一个需求,某个业务系统每天产生20G原始数据,我们每天都要对其进行处理,处理步骤如下所示:
- 通过Hadoop先将原始数据同步到HDFS上;
- 借助MapReduce计算框架对原始数据进行转换,生成的数据以分区表的形式存储到多张Hive表中;
- 需要对Hive中多个表的数据进行JOIN处理,得到一个明细数据Hive大表;
- 将明细数据进行复杂的统计分析,得到排序后的报表信息;
- 需要将统计分析得到的结果数据同步到业务系统中,供业务调用使用
安装Oozie Server
Oozie Server可以为我们提供很多管理Job的便捷功能,比如,通过可视化界面去管理Job的运行状态,同时也支持我构建含有多个复杂Hadoop Job流程,各个Job之间的依赖关系完全可以通过一个工作流配置文件组装起来,然后由Oozie Server其管理执行。
- 安装Maven构建工具
下载安装,执行如下命令:
wget http://mirrors.hust.edu.cn/apache/maven/maven-3/3.2.1/binaries/apache-maven-3.2.1-bin.tar.gz tar xvzf apache-maven-3.2.1-bin.tar.gz 加入环境变量,使变量配置生效:
export MAVEN_HOME=/home/hadoop/software/apache-maven-3.2.1 export PATH=$PATH:$MAVEN_HOME/bin
- 安装MySQL数据库
安装MySQL数据库,执行如下命令:
1 |
sudo rpm -e --nodeps mysql
|
2 |
yum list | grep mysql
|
3 |
sudo yum install -y mysql-server mysql mysql-deve
|
为root用户设置密码:
1 |
mysqladmin -u root password '8YOhyo988_Kjo0'
|
然后可以使用root账号登录MySQL数据库,进行管理:
1 |
mysql -u root -p |
输入密码登录成功。
- 安装配置Tomcat
下载安装Tomcat Web服务器:
2 |
tar xvzf apache-tomcat-7.0.52.tar.gz
|
设置环境变量:
1 |
export CATALINA_HOME=/home/shirdrn/cloud/programs/apache-tomcat-7.0.52
|
2 |
export PATH=$PATH:$CATALINA_HOME/bin
|
如果使用MySQL存储Oozie数据,需要将MySQL的驱动程序拷贝到Tomcat安装目录下,亦即$CATALINA_HOME/lib下面
- 准备ExtJS工具包
下载ExtJS压缩包:
http://oozie.apache.org/docs/4.0.1/DG_QuickStart.html网址中
System Requirements中可以直接链接下载
下载安装,执行如下命令:
1 |
下载oozie-4.0.1.tar.gz |
2 |
tar xvzf oozie-4.0.1.tar.gz
|
3 |
cd oozie-4.0.1 |
4 |
mvn -DskipTests=true -P hadoop-2 clean package assembly:single |
构建成后,可以在oozie-3.3.2/distro/target目录下看到构建后的文件,例如我的路径是/home/shirdrn/cloud/programs/oozie-3.3.2/distro/target/oozie-3.3.2-distro/oozie-3.3.2,内容如下所示:
1 |
[shirdrn@oozie-server oozie-3.3.2]$ pwd
|
2 |
/home/shirdrn/cloud/programs/oozie-3.3.2/distro/target/oozie-3.3.2-distro/oozie-3.3.2 |
3 |
[shirdrn@oozie-server oozie-3.3.2]$ ls
|
4 |
bin lib oozie-core oozie-sharelib-3.3.2.tar.gz
|
5 |
conf libtools oozie-examples.tar.gz oozie.war
|
6 |
docs.zip oozie-client-3.3.2.tar.gz oozie-server release-log.txt
|
将OOZIE_HOME变量指向该目录,修改~/bashrc文件:
1 |
export OOZIE_HOME=/home/shirdrn/cloud/programs/oozie-3.3.2/distro/target/oozie-3.3.2-distro/oozie-3.3.2
|
2 |
export PATH=$PATH:$OOZIE_HOME/bin
|
将ExtJS工具包拷贝到目录$OOZIE_HOME中:
1 |
cp ~/cloud/programs/oozie-3.3.2/ext-2.2.zip $OOZIE_HOME/
|
在上面的目录下创建libext目录,并将hadoop相关的jar库文件拷贝到libext下面,我使用的是Hadoop 1.2.1版本:
1 |
[shirdrn@oozie-server oozie-3.3.2]$ mkdir libext
|
2 |
[shirdrn@oozie-server oozie-3.3.2]$ cp ~/hadoop-2.2.0/share/hadoop/*/hadoop-*.jar ./libext/ |
3 |
[shirdrn@oozie-server oozie-3.3.2]$ cp ~/hadoop-2.2.0/share/hadoop/*/lib/*.jar ./libext/ |
同时,我们使用了MySQL来存储Oozie的元数据,现在需要将MySQL的驱动程序添加到libext目录下:
1 |
cp ~/packages/mysql-connector-java-5.1.29/mysql-connector-java-5.1.29/mysql-connector-java-5.1.29-bin.jar libext/
|
这里需要删除libext 下的一些包(~/software/oozie-4.0.1/oozie-server/lib/下已经有的包,
jasper.jar, servlet-api.jar, jsp-api.jar)
否则可能在下面打war,启动后会遇到:下面2中错误
org.eclipse.jdt.internal.compiler.CompilationResult.getProblems()[Lorg/eclipse/jdt/core/compiler/IProblem;
和
exception
org.apache.jasper.JasperException: java.lang.NullPointerException
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:538)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:370)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
执行下面的命令开始安装:
1 |
bin/oozie-setup.sh prepare-war |
运行结果,示例如下:
setting CATALINA_OPTS="$CATALINA_OPTS -Xmx1024m" INFO: Adding extension: /home/shirdrn/cloud/programs/oozie-3.3.2/distro/target/oozie-3.3.2-distro/oozie-3.3.2/libext/asm-3.2.jar INFO: Adding extension: /home/shirdrn/cloud/programs/oozie-3.3.2/distro/target/oozie-3.3.2-distro/oozie-3.3.2/libext/aspectjrt-1.6.11.jar .... New Oozie WAR file with added 'ExtJS library, JARs' at /home/shirdrn/cloud/programs/oozie-3.3.2/distro/target/oozie-3.3.2-distro/oozie-3.3.2/oozie-server/webapps/oozie.war INFO: Oozie is ready to be started
这样,上述已经生成了/home/shirdrn/cloud/programs/oozie-3.3.2/distro/target/oozie-3.3.2-distro/oozie-3.3.2/oozie-server/webapps/oozie.war文件。
- 配置Oozie
修改conf/oozie-site.xml配置文件,内容如下所示:
<property>
<name>oozie.service.JPAService.jdbc.driver</name>
<value>com.mysql.jdbc.Driver</value>
<description>
JDBC driver class.
</description>
</property>
<property>
<name>oozie.service.JPAService.jdbc.url</name>
<value>jdbc:mysql://mysql-server:3306/oozie</value>
<description>
JDBC URL.
</description>
</property>
<property>
<name>oozie.service.JPAService.jdbc.username</name>
<value>shirdrn</value>
<description>
DB user name.
</description>
</property>
<property>
<name>oozie.service.JPAService.jdbc.password</name>
<value>0o21e</value>
<description>
DB user password.
IMPORTANT: if password is emtpy leave a 1 space string, the service trims the value,
if empty Configuration assumes it is NULL.
</description>
</property>
默认情况下,Oozie的配置中有个配置项oozie.service.JPAService.create.db.schema,值为false,设置非自动创建数据库,我们保持默认设置,这样可以通过手动创建Oozie数据库,并对其进行权限控制。然后,我们在MySQL数据库中创建数据库,名称为oozie,并进行访问授权:
CREATE DATABASE oozie; G R A N T ALL ON oozie.* TO 'shirdrn'@'oozie-server' IDENTIFIED BY '0o21e'; FLUSH PRIVILEGES;
然后可以执行如下命令,生成Oozie所需要的数据表:
bin/ooziedb.sh create -sqlfile oozie.sql -run
查看控制台输出日志,没有报错,并且在当前目录下可以看到,同时也生成了oozie.sql脚本文件。到MySQL数据库中可以看到生成的表,说明上述操作执行成功。
下面可以启动Oozie,使用如下命令:
bin/oozied.sh start
启动信息,示例如下所示:
[hadoop@luxury oozie-4.0.1]$ ./bin/oozied.sh start
Setting OOZIE_HOME: /home/hadoop/software/oozie-4.0.1 Setting OOZIE_CONFIG: /home/hadoop/software/oozie-4.0.1/conf Sourcing: /home/hadoop/software/oozie-4.0.1/conf/oozie-env.sh setting CATALINA_OPTS="$CATALINA_OPTS -Xmx1024m" Setting OOZIE_CONFIG_FILE: oozie-site.xml Setting OOZIE_DATA: /home/hadoop/software/oozie-4.0.1/data Setting OOZIE_LOG: /home/hadoop/software/oozie-4.0.1/logs Setting OOZIE_LOG4J_FILE: oozie-log4j.properties Setting OOZIE_LOG4J_RELOAD: 10 Setting OOZIE_HTTP_HOSTNAME: luxury Setting OOZIE_HTTP_PORT: 11000 Setting OOZIE_ADMIN_PORT: 11001 Setting OOZIE_HTTPS_PORT: 11443 Setting OOZIE_BASE_URL: http://luxury:11000/oozie Setting CATALINA_BASE: /home/hadoop/software/oozie-4.0.1/oozie-server Setting OOZIE_HTTPS_KEYSTORE_FILE: /home/hadoop/.keystore Setting OOZIE_HTTPS_KEYSTORE_PASS: password Setting CATALINA_OUT: /home/hadoop/software/oozie-4.0.1/logs/catalina.out Setting CATALINA_PID: /home/hadoop/software/oozie-4.0.1/oozie-server/temp/oozie.pid
Using CATALINA_OPTS: -Xmx1024m -Dderby.stream.error.file=/home/hadoop/software/oozie-4.0.1/logs/derby.log Adding to CATALINA_OPTS: -Doozie.home.dir=/home/hadoop/software/oozie-4.0.1 -Doozie.config.dir=/home/hadoop/software/oozie-4.0.1/conf -Doozie.log.dir=/home/hadoop/software/oozie-4.0.1/logs -Doozie.data.dir=/home/hadoop/software/oozie-4.0.1/data -Doozie.config.file=oozie-site.xml -Doozie.log4j.file=oozie-log4j.properties -Doozie.log4j.reload=10 -Doozie.http.hostname=luxury -Doozie.admin.port=11001 -Doozie.http.port=11000 -Doozie.https.port=11443 -Doozie.base.url=http://luxury:11000/oozie -Doozie.https.keystore.file=/home/hadoop/.keystore -Doozie.https.keystore.pass=password -Djava.library.path=
Using CATALINA_BASE: /home/hadoop/software/oozie-4.0.1/oozie-server Using CATALINA_HOME: /home/hadoop/software/apache-tomcat-7.0.54 Using CATALINA_TMPDIR: /home/hadoop/software/oozie-4.0.1/oozie-server/temp Using JRE_HOME: /usr/local/jdk/jre Using CLASSPATH: /home/hadoop/software/oozie-4.0.1/oozie-server/bin/tomcat-juli.jar:/home/hadoop/software/apache-tomcat-7.0.54/bin/bootstrap.jar Using CATALINA_PID: /home/hadoop/software/oozie-4.0.1/oozie-server/temp/oozie.pid
从上面日志可以看到,Oozie管理控制台连接为http://luxury:11000/oozie,可以看到图形化界面。
- 整合Oozie和Hadoop
我们的Hadoop平台使用的是用户hadoop,用户组为hadoop,这里配置Hadoop代理用户也使用该用户,部署Oozie的主机名为luxury。修改Hadoop的配置文件core-site.xml,增加如下配置内容:
<!-- OOZIE -->
<property>
<name>hadoop.proxyuser.hadoop.hosts</name>
<value>luxury</value>
</property>
<property>
<name>hadoop.proxyuser.hadoop.groups</name>
<value>hadoop</value>
</property>
修改完上述配置后,需要重新启动Hadoop集群才能生效。
安装Oozie Client
我们可以通过在外部的一个Oozie客户端去提交工作流任务,实际上就是一个客户端程序,通过与Oozie Server进行交互,提交任务,并由Oozie Server去调用执行。
我们可以回到前面解压缩Oozie发行包oozie-3.3.2.tar.gz的目录下,通过前面的构建,现在已经可以看到有一个client目录,该目录下就是Oozie的客户端相关文件。含有Oozie客户端脚本的路径,我这里为/home/shirdrn/cloud/programs/oozie-3.3.2/client/target/oozie-client-3.3.2-client/oozie-client-3.3.2。
查看Oozie客户端运行job的命令帮助信息,可以执行如下命令:
cd /home/shirdrn/cloud/programs/oozie-3.3.2/client/target/oozie-client-3.3.2-client/oozie-client-3.3.2 bin/oozie help bin/oozie help job
我们可以找到,Oozie发行包中自带的examples,我这里对应的目录是/home/shirdrn/cloud/programs/oozie-3.3.2/examples/target/oozie-examples-3.3.2-examples/examples/apps,我们可以通过运行这些例子来验证安装是否成功。
首先,将Oozie自带的examples上传到HDFS上:
hadoop fs -mkdir /oozie
hadoop fs -copyFromLocal /home/hadoop/software/oozie-4.0.1/examples/ /user/hadoop/examples
我们拿examples中的map-reduce来进行验证,修改job.properties文件,配置内容如下所示:
nameNode=hdfs://10.100.50.50:54310 jobTracker=10.100.50.50:54312 queueName=default examplesRoot=examples
oozie.wf.application.path=${nameNode}/user/${user.name}/${examplesRoot}/apps/map-reduce
outputDir=map-reduce
运行任务,执行如下命令:
cd /home/hadoop/software/oozie-4.0.1/oozie-client-4.0.1
./bin/oozie job -oozie http://luxury:11000/oozie -config /home/hadoop/software/oozie-4.0.1/examples/apps/map-reduce/job.properties -run
可以通过OozieWeb管理控制台查看提交运行的任务,如图所示:
上面命令选项-run表示直接运行一个job,当然你可以使用其他选项,如-submit是提交job,-rerun是重新运行job,-suspend是挂起job等等,可以查看命令帮助,或参考相关文档。